JavaScript中有一些方法近似实现类的功能,他并没有类
混入
-
显示混入 使用call绑定this
-
混合复制
function mixin(sobj,tobj) { for(var key in sobj) { if(!(key in tobj)) { //什么都不存在的情况下复制 tobj[key] = sobj[key]; } } return tobj; } var vehicle = { engines: 1, ignition: function() { console.log("点火器点着了"); }, drive: function() { this.ignition(); console.log('发车啦'); } } var car = mixin(vehicle, { wheels: 4, drive: function() { // vehicle.drive(); //显示绑定 将vehicle.drive绑定到当前this上 this.ignition 调用的就是vehicle里的ignition方法 vehicle.drive.call(this); console.log('轮子开始走了'); } }) var a = mixin(vehicle, {}) // vehicle.drive() car.drive() // a.drive()
-
寄生继承
function Vehicle() { this.engines = 1; } Vehicle.prototype.ignition = function() { console.log('打开引擎'); }; Vehicle.prototype.drive = function() { this.ignition(); console.log('开始走'); }; function Car() { var car = new Vehicle(); //实例化一个Vehicle对象 car.wheels = 4; //加入新的属性 var vehDrive = car.drive; //维持一个函数drive的引用 car.drive = function() { //重写drive // vehDrive(); vehDrive.call(this); //绑定到当前this console.log(this.wheels + '走起~'); } return car; } var aCar = new Car(); aCar.drive(); aCar.ignition();
-
-
隐式混入 在构造函数调用或者方法调用中使用call,把某个对象的某个属性绑定进来
var a = { say: function() { this.name = 'zz'; this.age = '18' } } var b = { say1:function() { a.say.call(this) //隐式混入 } }
在
a.say()
中的赋值操作都会应用在b上而不是a上