sailei1 / blog

1 stars 0 forks source link

你不知道的JavaScript -混合对象 “类” 笔记 #72

Closed sailei1 closed 4 years ago

sailei1 commented 4 years ago

混入 JavaScript 中只有对象,并不存在可以被实例化的“类”。一个对象并不会被复制到其他对象,它们会被关联起来

function mixin( sourceObj, targetObj ) {
       for (var key in sourceObj) {
    // 只会在不存在的情况下复制
           if (!(key in targetObj)) {
                 targetObj[key] = sourceObj[key];
             }
         }
return targetObj; 
}

JavaScript 中的函数无法(用标准、可靠的方法)真正地复制,所以你只能复制对共享函数对象的引用(函数就是对象)。如果你修改了共享的函数对象(比如ignition()),比如添加了一个属性,那 Vehicle 和 Car 都会受到影响。

寄生式继承

//“传统的 JavaScript 类”Vehicle 
function Vehicle() {
    this.engines = 1; 
}
Vehicle.prototype.ignition = function() { 
    console.log( "Turning on my engine." );
};
Vehicle.prototype.drive = function() {
        this.ignition();
        console.log( "Steering and moving forward!" );
};

//“寄生类”Car 
function Car() {
// 首先,car 是一个 Vehicle 
var car = new Vehicle();
// 接着我们对 car 进行定制 
car.wheels = 4;
// 保存到 Vehicle::drive() 的特殊引用 
var vehDrive = car.drive;
// 重写 Vehicle::drive() 
car.drive = function() {
             vehDrive.call( this );
             console.log(
                 "Rolling on all " + this.wheels + " wheels!"
             );
    return car; 
}
var myCar = new Car();
myCar.drive();

JavaScript 并不会其他的编程语言的类那样(JS的类也是函数),自动创建对象的副本。