顯示混入:
function mixin(sourceObj, targetObj){for(var key in sourceObj){ // 遍歷source中的所有屬性if(!(key in targetObj)) { // 找到targetz中沒有的屬性targetObj[key] = sourceObj[key];}}return targetObj;
}var Vehicle = {engines: 1,iginition: function() {console.log("Turning on my engine.");},drive: function(){this.ignition();console.log("Steering an moving forward!" );}
};var Car = mixin( Vehicle, {wheels: 4,drive: function() {Vehicle.drive.call( this);console.log(" Rolling on all " + this.wheels + " wheels!");}
});
寄生繼承:
// 既是顯式的又是隱式的
function Vehicle() {this.engines = 1;
}
Vehicle.prototype.iginition = function() {console.log("Turning on my engine.");
}
Vehicle.prototype.drive = function() {this.ignition();console.log("Steering and moving forward!");
};// "寄生類"Car
function Car(){var car = new Vehicle();car.wheels = 4;var vehDrive = car.drive;car.drive = function(){vehDrive.call(this);console.log("Rolling on all" + this.wheels + "wheels!);}return car;
}
var myCar = new Car();myCar.drive();// Turning on my engine.
// Steering and moving forward!
// Rolling on all 4 wheels!
隱式混入:
var Something = {cool: function() {this.greeting = "Hello World";this.count = this.count ? this.count + 1: 1; // 存在count,次數加1,否則初始值為1}
};
Something.coll();
Something.greeeting = "Hello World";
Something.count = 1;var Another = {cool: function() {Something.cool.call(this); // 執行Something.cool,作用域是Another的}
};
Another.cool();
Another.greeting = "Hello World";
Another.count = 1; // 注.Another.count 和 Something.count不共享狀態.
參考《你不直到的JavaScript》(上卷) P135~P140