如果我有一个基函数构造函数,如
function Foo() {}
Foo.prototype.bar = 'Hello';
我做了
var foo = new Foo();
console.log(foo);
输出
{}
如果不在构造函数中手动设置this.bar = 'Hello';
,是否可以将原型属性公开给实例?换句话说,是否可以预设原型并将属性公开为ownProperties
到该原型的对象实例?
预期的结果应该是
{ bar: 'Hello' }
答案 0 :(得分:1)
您已正确完成,只需执行
console.log(foo.bar);
你会看到你想要的东西。您在某些浏览器中看到{}
只是因为它在某些浏览器中的显示方式。例如,在Safari上,你可以深入研究"该对象,并在您关注bar
链时看到__proto__
。
bar
不是foo
" s"拥有的属性"这条路。为了使其成为foo
自己的媒体资源,您需要设置foo.bar
以使其成为foo
自己的媒体资源。
说明:
foo
是一个变量,它是对象的引用(让我们调用这个对象A)。 __proto__
属性。foo.__proto__
是对象的引用,(让我们调用这个对象B),这正是Foo.prototype的引用。foo.bar
时,首先JavaScript引擎在对象A中查找属性bar
是否存在,并且由于它不存在,它将跟随foo.__proto__
并查看对象B,找到它,并将结果返回给你。请注意foo.__proto__
is deprecated。它不是标准,但目前可以在Chrome,Firefox和Safari中使用,以试验您的代码,但在IE上,一般情况下,您需要Object.getPrototypeOf(foo)
才能看到它。
答案 1 :(得分:-1)
换句话说,是否可以预设原型并将属性作为ownProperties公开给该原型的对象实例?
您不能直接执行此操作,但Proxy对象可以截取Object.getOwnPropertyNames
和类似内容。
如果你想支持Firefox以外的浏览器,你必须编写自己的函数来检索属性(你也可以覆盖Object.getOwnPropertyNames
但我不推荐它 - 不要修改对象你不拥有)。