【问题标题】:prototype object property created by constructor function in javascriptjavascript中构造函数创建的原型对象属性
【发布时间】:2015-03-24 08:14:30
【问题描述】:

在 JavaScript 中,如果我创建一个构造函数 Foo,一个原型 对象也将被创建为 Foo.prototype。所以我尝试了这个:

function Foo() { this.xx = 1000}

我认为创建的原型对象 Foo.prototype 将具有 属性 xx = 1000。所以我尝试了这个:

console.log(Foo.prototype.xx);

但结果是“未定义”。这是为什么呢?

不应该有一个具有单一属性 xx 的 Foo.prototype 对象 1000?

谢谢。

【问题讨论】:

  • this.xx 指的是实例对象,而不是原型...
  • 无论你在构造函数中做什么,在你调用构造函数之前它都不会被计算。没有new Foo(),任何地方都不会有xx。而且它也不在原型上。
  • 也许下面的答案可以帮助你:stackoverflow.com/a/16063711/1641941

标签: javascript prototype


【解决方案1】:

如果在构造函数中添加属性,每个实例都会有自己的副本:

function Foo1() {
    this.xx = [1000];
}
var foo1 = new Foo1(),
    foo2 = new Foo1();
foo1.hasOwnProperty('xx'); // true
foo2.hasOwnProperty('xx'); // true
foo1.xx == foo2.xx;        // false (each instance has a different copy)

您还可以使用原型继承。然后,所有实例共享相同的继承属性:

function Foo2() {}
var foo1 = new Foo2(),
    foo2 = new Foo2();
'xx' in foo1; // false
'xx' in foo2; // false
Foo2.prototype.xx = [1000];
'xx' in foo1; // true
'xx' in foo2; // true
foo1.hasOwnProperty('xx'); // false (it's inherited)
foo2.hasOwnProperty('xx'); // false (it's inherited)
foo1.xx == foo2.xx;        // true (all instances share the same value)

【讨论】:

  • 感谢 oriol 的快速回答。所以我猜属性 xx 将永远是实例化对象中的属性(这个指向的对象,而不是从 Foo.prototype 中“共享”的对象),而 Foo.prototype 开始时总是为空的?
  • @完全是的。好吧,Foo.prototype 将包含一个不可枚举的constructor 属性,其值为Foo,并且还将继承自Object.prototype
猜你喜欢
  • 1970-01-01
  • 2010-10-07
  • 2014-01-05
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多