Javascript foo.prototype.x=&;之间的差异;foo.prototype={x:}

Javascript foo.prototype.x=&;之间的差异;foo.prototype={x:},javascript,prototype,Javascript,Prototype,我不明白为什么fooA和fooB的结果不同 var foo = function(){} fooA = new foo(); foo.prototype.x = 1; foo.prototype = { y: 2, z: 3}; console.log(fooA.x, fooA.y, fooA.z);// 1, undefined, undefined fooB = new foo(); console.log(fooB.x, fooB.y, fooB.z);// undefined,

我不明白为什么fooA和fooB的结果不同

var foo = function(){}

fooA = new foo();

foo.prototype.x = 1;
foo.prototype = { y: 2, z: 3};

console.log(fooA.x, fooA.y, fooA.z);// 1, undefined, undefined

fooB = new foo();
console.log(fooB.x, fooB.y, fooB.z);// undefined, 2, 3
  • foo.prototyp={}是否覆盖前面定义的方法

  • 为什么fooA是prototype.x前面的state,它继承结果,而不是y和z

  • 考虑

    var foo = function(){}
    
    fooA = new foo();
    
    foo.prototype.x = 1;
    console.log(fooA.__proto__) // {x:1}
    
    foo.prototype = { y: 2, z: 3};
    console.log(fooA.__proto__) // still {x:1}
    
    对象的原型在创建时分配(当调用
    new
    时),之后不会更改。
    有关详细信息,请参见。

    该行为的原因是,在使用
    foo.prototype={y:2,z:3}时,使
    foo.prototype
    指向一个新对象prototype
    属性设置为新值时,现有对象的原型不会更改

    逐行解释发生的情况:

    var foo=function(){}

    foo.prototype
    初始化为空对象(我们将此对象称为
    A

    fooA=new foo()

    fooA
    设置为新的foo对象,其原型设置为
    foo.prototype
    a

    foo.prototype.x=1

    因为
    fooA
    的原型是与
    foo.prototype
    相同的对象,
    fooA.x
    变为1。换句话说,
    A
    获取属性
    x=1

    foo.prototype={y:2,z:3}
    
    我们创建一个新对象,该对象的属性为
    y=2
    z=3
    。我们将这个对象称为
    B
    foo.prototype
    设置为新对象

    console.log(fooA.x、fooA.y、fooA.z)
    
    fooA
    的原型仍然是
    A
    ,它只有
    x=1
    属性

    fooB=newfoo()
    
    我们创建了一个新的foo对象,其原型是
    B

    console.log(fooB.x、fooB.y、fooB.z)
    
    fooB
    的原型是
    B
    ,它有属性
    y=2
    z=3
    ,但没有属性
    x

    F.prototype = { ... };
    
    替换构造函数
    F
    prototype
    对象。旧的
    prototype
    对象被新的
    prototype
    对象替换

    F

    var f = new F();
    
    有一个隐式的原型链接,该链接引用构造函数
    F
    prototype
    对象。但是,此引用是在实例初始化期间建立的

    比如说

    var f1 = new F();
    F.prototype = { ... };
    var f2 = new F();
    
    这里,
    f1
    的原型链接指的是旧的
    prototype
    对象,而
    f2
    的原型链接指的是新的
    prototype
    对象


    请注意,即使替换了
    F.prototype
    对象,只要至少有一个
    F
    的实例的prototype链接引用它,旧的
    prototype
    对象将继续存在。
    实际上是将
    Foo
    重新定义为一个对象,您只是被夹在更改前后定义的实例之间。使用
    console.log(FooA);控制台日志(FooB)以清楚地看到差异。