在javascript中,“原型属于不是实例的类”是什么意思?

时间:2011-05-27 10:02:45

标签: javascript prototype-programming

我问了这个问题:

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访问器添加其他成员吗?

3 个答案:

答案 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的原型是一个与类非常相似但不完全相同的概念。阅读下面的文章,它提供了有关此问题的互联网上最好的解释之一。

http://www.crockford.com/javascript/inheritance.html

答案 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 创建的实例使用。