這是我第一次OOP刺,所以請多多包涵:如何傳遞一個對象的方法陣列的方法在JavaScript中
(function(){
var Ship = function(){
this.passengers = [];
this.hasAliens = function() {
return this.passengers.some(function(passenger){
return passenger.isAlien()
});
}
};
var Passenger = function(){};
Passenger.prototype.isAlien = function(){
return this instanceof Alien;
};
Passenger.prototype.board = function(ship) {
ship.passengers.push(this)
}
var Alien = function() { Passenger.call(this); }
var Human = function() { Passenger.call(this); }
Alien.prototype = Object.create(Passenger.prototype);
Human.prototype = Object.create(Passenger.prototype);
Alien.prototype.constructor = Alien.constructor;
Human.prototype.constructor = Human.constructor;
var ship = new Ship();
var john = new Human();
var zorg = new Alien();
//simple testing
john.board(ship);
console.log("Ship does not have aliens ", ship.hasAliens()===false);
zorg.board(ship);
console.log("Ship has aliens ", ship.hasAliens()===true);
})();
這工作得很好。但是,我想知道如何通過Passenger.isAlien()
方法來爲我節省那個討厭的嵌套匿名函數。我試圖做這樣的:
var Ship = function(){
this.passengers = [];
this.hasAliens = function(){
return this.passengers.some(Passenger.isAlien);
};
};
但是,這給了我"undefined is not a function"
你的代碼有一些缺陷。例如。 'Alien.prototype = Object.create(Passenger);'應該是'Alien.prototype = Object.create(Passenger.prototype);'而不是在'Passenger'構造函數中分配函數,你應該把它們分配給'Passenger .prototype'。關於你的問題:你得到的錯誤是因爲'isAlien'是構造函數的*實例*的屬性,而不是構造函數本身。沒有比使用匿名函數更簡潔的方法。 –