MFo*_*ter 6 javascript prototype
我知道prototype
JavaScript函数对象的属性被复制到使用该函数作为构造函数实例化的对象的内部[[Prototype]]
属性(也称为__proto__
).所以,我可以将此属性设置为我想要充当原型的任何对象:
function Foo() {}
Foo.prototype = {
toString: function() { return "I'm a Foo!"; }
}
new Foo().toString()
// --> "I'm a Foo!"
Run Code Online (Sandbox Code Playgroud)
看起来普遍的做法是添加应该作为类方法的函数来处理新生成的函数的现有原型,如下所示:
function Bar() {}
Bar.prototype.toString = function() {
return "I'm a Bar!";
}
new Bar().toString()
// --> "I'm a Bar!"
Run Code Online (Sandbox Code Playgroud)
但是,我不清楚该物业的初始价值是多少prototype
.
function Baz() {}
Baz.prototype
// --> Baz {
// constructor: function Baz() {},
// __proto__: Object
// }
Run Code Online (Sandbox Code Playgroud)
该评论显示了Chrome的JavaScript控制台打印的内容.这是否意味着我创建的每个函数实际上都创建了两个对象?一个用于功能本身(constructor
)和一个用于其原型?
这是在ECMAScript标准中的某个地方定义的吗?我试图找到它但不能.所有浏览器都以同样的方式处理这个问题吗?
bob*_*nce 10
prototype
任何新创建的Function
实例的初始值都是一个新实例Object
,但constructor
设置了own-property 以指向新函数.
ECMA262-5在第13.2节中以典型的ECMAScript规范完全不可读的方式描述了这一点:
(16.)让proto成为创建一个新对象的结果,这个对象将由表达式构造,
new Object()
其中Object
是具有该名称的标准内置构造函数(17.)使用参数"constructor"调用proto的[[DefineOwnProperty]]内部方法,属性描述符{[[Value]]:F,{[[Writable]]:true,[[Enumerable]]:false,[ [Configurable]]:true}和false.
(18.)使用参数"prototype"调用F的[[DefineOwnProperty]]内部方法,属性描述符{[[Value]]:
proto
,{[[Writable]]:true,[[Enumerable]]:false,[[可配置]]:false}和false.