修改父构造函数不会影响子

时间:2018-12-13 20:54:26

标签: javascript

在已用于创建对象的情况下修改构造函数定义时,对象属性是否被覆盖,就好像该对象是自己重新创建的一样?类似于原型链如何在修改原型时使方法保持更新。

function ParentFunction(a){
this.a = a;
this.method = function(){console.log(this.name);}
}

var parent = {};
parent.__proto__ = ParentFunction.prototype;
ParentFunction.call(parent,1);

//child linking
var child = {};
child.__proto__ = parent; // child now has a and method


// changing parent constructor
parent.__proto__.constructor = function ParentFunction(a){
this.a = a;
this.method = function(){console.log("new");}
}

// this does not change child.method function. why not?

2 个答案:

答案 0 :(得分:1)

  1. 请勿使用已被弃用的 proto ,请将原型与Object.create结合使用,例如:

    SomeClass.prototype = Object.create(SomeOtherClass.prototype);
    
  2. 不要将方法放入构造函数中。这样,将为每个实例创建该方法。将该方法放在原型上,以便成员可以共享它。

    SomeClass.prototype.someMethod = () => {...}
    

关于您的问题,已经在其中一条评论中得到了回答。

答案 1 :(得分:0)

如果要为某个类型的所有实例更改方法,则不要使用构造函数将方法附加到对象的实例,请将其附加到原型。

function Obj() {
  this.x = 5;
}

Obj.prototype.method = function () {
  console.log(`Original method displays the value of x: ${this.x}`);
}

let instance = new Obj();

instance.method();

Obj.prototype.method = function () {
  console.log(`New method displays the value of x times 2: ${this.x * 2}`);
}

instance.method();