我正在学习 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 是什么?
最佳答案
因为您正在继承锁定到特定闭包的特定实例。数据归属于 闭包而不是对象。对象的变量和属性之间存在巨大差异。
这里根本没有使用
var private
。当您setPrivate()
时,会在此时创建该属性。不,这只是偶然,因为闭包和对象模型之间存在误解。你也可以做到的 以更深思熟虑和更清晰的方式:使用简单的对象文字。
不同之处在于,在第一个中你得到一个新对象,而在第二个中你有
A.prototype === B.prototype
所以修改 一个将修改另一个,因为它们引用相同的对象。对象继承自其他对象
这是一个很好的资源 https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model
关于javascript - 理解 javascript 原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214547/