javascript - 理解 javascript 原型(prototype)

标签 javascript prototype-programming

我正在学习 JS 原型(prototype)。

如果我从其他构造函数 (B) 的实例设置构造函数 (A) 的原型(prototype),该实例(B)是否会在 A 中引入共享属性?

示例 1

function A(){ 
    var private = '';

    this.getPrivate = function(){ 
        return private
    }; 

    this.setPrivate = function(_private){ 
        private = _private; 
    }; 
}

function B(){};

B.prototype = new A();

b1 = new B();
b2 = new B();

b1.setPrivate(new Date());
b2.getPrivate(); // Here `private` is behaving as singleton property. Why?

示例 2

function A(){ 
    var private = '';
}

A.prototype.getPrivate = function(){ 
    return this.private
}; 

A.prototype.setPrivate = function(_private){ 
    this.private = _private; 
}; 

function B(){};

B.prototype = new A();

b1 = new B();
b2 = new B();

b1.setPrivate(new Date());
b2.getPrivate(); // This time private is not singleton property.

我在玩原型(prototype)的过程中发现了它的这个新方面。

  • 在示例 1 中,为什么 private 属性在 B 的不同实例之间共享?
  • 在示例 2 中,为什么 private 属性在两个实例中都独立存在?然而,原始属性没有改变,但 getter/setter 是通过原型(prototype)定义的。
  • 可以将示例 1 视为单例属性的实现吗?
  • 通过实例制作原型(prototype)和通过原型(prototype)制作原型(prototype),有什么区别?例如
    B.prototype = new A();
    B.prototype = (new A()).constructor.prototype
  • 原型(prototype)制作的全部 secret 是什么?

最佳答案

  1. 因为您正在继承锁定到特定闭包的特定实例。数据归属于 闭包而不是对象。对象的变量和属性之间存在巨大差异。

  2. 这里根本没有使用var private。当您 setPrivate() 时,会在此时创建该属性。

  3. 不,这只是偶然,因为闭包和对象模型之间存在误解。你也可以做到的 以更深思熟虑和更清晰的方式:使用简单的对象文字。

  4. 不同之处在于,在第一个中你得到一个新对象,而在第二个中你有 A.prototype === B.prototype 所以修改 一个将修改另一个,因为它们引用相同的对象。

  5. 对象继承自其他对象

这是一个很好的资源 https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model

关于javascript - 理解 javascript 原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214547/

相关文章:

javascript - 'bol === !0' 和 'bol == true' 相同吗?

javascript - Three.js 创建多个对象

javascript - 需要 jQuery 鼠标悬停或悬停帮助

javascript inheritFrom 与原型(prototype)

Javascript:一旦 'class/object' 变为 'extended' ,是否可以使用不同的基数 'class/object' 重新扩展它?

javascript - 修改内置对象原型(prototype)

显示 GIF 的 JavaScript 函数

javascript - Bootstrap 轮播显示不正确

javascript - 在构造函数中定义原型(prototype)方法

私有(private)属性的 Javascript 动态 getter/setter