JavaScript公开原型属性

时间:2014-04-04 18:59:37

标签: javascript prototypal-inheritance

如果我有一个基函数构造函数,如

function Foo() {}
Foo.prototype.bar = 'Hello';

我做了

var foo = new Foo();
console.log(foo);

输出

{}

如果不在构造函数中手动设置this.bar = 'Hello';,是否可以将原型属性公开给实例?换句话说,是否可以预设原型并将属性公开为ownProperties到该原型的对象实例?

预期的结果应该是

{ bar: 'Hello' }

2 个答案:

答案 0 :(得分:1)

您已正确完成,只需执行

console.log(foo.bar);

你会看到你想要的东西。您在某些浏览器中看到{}只是因为它在某些浏览器中的显示方式。例如,在Safari上,你可以深入研究"该对象,并在您关注bar链时看到__proto__

bar不是foo" s"拥有的属性"这条路。为了使其成为foo自己的媒体资源,您需要设置foo.bar以使其成为foo自己的媒体资源。

说明:

  1. foo是一个变量,它是对象的引用(让我们调用这个对象A)。
  2. 此对象具有" [[Prototype]]内部属性"或者在Firefox或Chrome浏览器中看到的__proto__属性。
  3. foo.__proto__是对象的引用,(让我们调用这个对象B),这正是Foo.prototype的引用。
  4. 当您说foo.bar时,首先JavaScript引擎在对象A中查找属性bar是否存在,并且由于它不存在,它将跟随foo.__proto__并查看对象B,找到它,并将结果返回给你。
  5. 请注意foo.__proto__ is deprecated。它不是标准,但目前可以在Chrome,Firefox和Safari中使用,以试验您的代码,但在IE上,一般情况下,您需要Object.getPrototypeOf(foo)才能看到它。

答案 1 :(得分:-1)

  

换句话说,是否可以预设原型并将属性作为ownProperties公开给该原型的对象实例?

您不能直接执行此操作,但Proxy对象可以截取Object.getOwnPropertyNames和类似内容。

如果你想支持Firefox以外的浏览器,你必须编写自己的函数来检索属性(你也可以覆盖Object.getOwnPropertyNames但我不推荐它 - 不要修改对象你不拥有)。