我问了这个问题:
Why cant I declare a constructor instantiate an object and then access the prototype?
你可以看到我已经标出了答案。我理解答案,但我对他的意思有点困惑:
The prototype belongs to the class, not the instance:
这是否意味着javascript在此示例中有一个类?我以为javascript是无类的?它只有函数构造函数......函数构造函数在什么时候成为一个类?是使用.prototype访问器添加其他成员吗?
答案 0 :(得分:3)
实际上class
是一个OOP术语,而不是真正的javascript。意思是原型属于constructor
。所以在
function MyConstructor(prop){
this.foo = prop || 'foo';
}
MyConstructor.prototype.bar = 'allways bar';
var mc1 = new MyConstructor('I am mc1'),
mc2 = new MyConstructor('I am mc2');
alert(mc1.bar) ; //=> allways bar
alert(mc2.bar) ; //=> allways bar
alert(mc1.foo) ; //=> I am mc1
alert(mc2.foo) ; //=> I am mc2
bar
属于构造函数(MyConstructor
)原型。对于每个实例,它总是'allways bar'。 foo
是一个实例属性(默认值为'foo'),可以为每个实例分配不同的值。
答案 1 :(得分:1)
JavaScript的原型是一个与类非常相似但不完全相同的概念。阅读下面的文章,它提供了有关此问题的互联网上最好的解释之一。
答案 2 :(得分:0)
javascript中没有类。
构造函数是函数,并具有引用对象的 prototype 属性。您可以向该对象添加函数,或者将新对象分配给prototype属性以创建继承链:
function MyConstructor () {
// initialise instance
}
MyConstructor.prototype.someMethod = function() {
// ...
};
MyConstructor.prototype.anotherMethod = function() {
// ...
};
或将其替换为另一个构造函数的实例:
MyConstructor.prototype = new SomeOtherConstructor();
MyConstructor.prototype.constructor = MyConstructor;
等等。现在,当创建一个MyConstructor实例时:
var anInstance = new MyConstructor();
构造函数返回的对象将 MyConstructor.prototype 作为其内部[[prototype]]属性,并“继承”其方法和属性(以及其整个[[prototype]]链上的那些)
因此 MyConstructor 的每个实例在其原型链上都有 MyConstructor.prototype 。但请注意, MyConstructor 不会从它自己的原型继承,它仅由 new MyConstructor 创建的实例使用。