为什么原型允许多个实例共享变量
why prototype allow multiple instances share variables?
>说,
function Person(name) {
this.name = name;
}
Person.prototype.share = [];
Person.prototype.printName = function() {
alert(this.name);
}
var person1 = new Person('Byron');
var person2 = new Person('Frank');
person1.share.push(1);
person2.share.push(2);
console.log(person2.share); //[1,2]
在上面,共享可以由所有实例使用。我想知道这是否特定于Javascript?其他OOP语言(如C++,C#或Java(有什么类似的吗?
因为这就是原型的工作方式。
在经典的OOP(Java,C#等(中,类只是"模板",继承只是组合要从中创建的实例的"模板"。在原型继承中,实例是其父对象是活动对象的对象。它们不仅共享定义,还共享父项的同一实时实例。
那么它为什么有效呢?这是因为原型查找的工作方式。如果在实例中找不到某些属性,引擎将在父实例中查找该属性。如果仍然不存在,它会在原型链中向上查找,直到到达根对象。如果仍然不存在,引擎可以将其声明为undefined
(如果是属性查找(或引发错误(如果调用了方法(。
instance -> parent -> parent -> parent -> Object
这就是JS"继承"的方式。它基本上只是寻找拥有你想要的东西的祖先,并在那个级别上运作。这就是为什么Person
实例可以推送到share
,因为它们有一个共同的父对象。
person1
'
> Person.prototype (which has share[])
/
person2
为了防止这种共享,可以通过在构造函数中声明一个 share
属性来覆盖它(实例化时,每个实例创建一个属性(。另一种方法是在实例上放置一个share
属性。后代属性优先于祖先属性,因为查找从底部开始。
function Person(name) {
this.name = name;
this.share = []; // Instances will have share, but not shared anymore
}
// or
person1.share = []; // Creates a share for person1 only
相关文章:
- 在索引.html和应用.js [node.js] 之间共享变量
- 在Knockoutjs中的ViewModels之间共享变量状态
- 共享变量和多个控制器AngularJS
- 在两个浏览器选项卡之间共享变量范围
- Javascript创建函数,以便在其他函数之间共享变量
- 为什么原型允许多个实例共享变量
- 关于node.js/javascript在文件之间共享变量
- 在 AngularJS 和非 AngularJS 弹出窗口之间共享变量
- nodejs-settimeout是否在不同的循环中共享变量
- 在Ember.js中的方法之间共享变量上下文
- 使用NodeJS与客户端共享变量
- 在页面之间共享变量
- 共享工作者确实共享变量
- 在Javascript中的函数之间共享变量
- Dojo:小部件实例共享相同的变量
- 在 JavaScript 命名空间中共享变量
- 嵌套函数中的 JavaScript 实例共享
- 获取保存函数实例的变量的名称,在此函数中
- 无论如何,是否有让实例共享相同的函数但同时具有私有变量
- 私有成员——跨实例共享的Javascript变量