原型详情

时间:2015-07-21 14:50:17

标签: javascript prototype

所以我来自Python,并试图围绕原型是什么。无论如何,我可以得到一个原型的Pythonic描述?听起来像描述符有一个 init 的宝宝。另外,我听说Prototype在DOM上使用时往往会产生负面影响。真的吗?如果是这样,为什么?谢谢,我一直在浏览大量的文章,而Prototype在这一点上对我没有意义!

1 个答案:

答案 0 :(得分:1)

在Javascript中,很像Python,一切都是对象。这包括功能。

Javascript没有课程。但是,您可以使用函数来模拟类的行为。

所有函数都有一个名为prototype的属性。 如果你说:

myInstance = new myFunction()

myFunction正在运行。 (因此它就像一个构造函数),结果存储在myInstance中。这里没什么了不起的,但new关键字的作用是将prototype属性从myFunction复制到内部属性myInstance。此属性在文档中称为[[prototype]],您可以在某些现代浏览器中将其引用为__proto____proto__虽然没有标准化,但不建议使用它。

如果您需要获取对象的[[prototype]],而不是使用__proto__使用Object.getProtoTypeOf(myInstance)

MyClass.prototype == Object.getPrototypeOf(myInstance) //true

当您在对象上调用方法时,如果该对象没有该方法,Javascript将查看其[[prototype]]属性。它将继续搜索原型(a.k.a.继承)链,直到它到达Object

以此为例:

function MyClass() {
  this.prop ="hello"

  //Javascript implicitly returns `this` when the function is invoked using "new"
} 

MyClass.prototype.instanceMethodOne = function() {
  console.log(this.prop);
}

var myInstance = new MyClass();

myInsance.instanceMethodOne(); //"hello"

在上面的示例中,myInstance将有一个名为prop的属性。但它没有名为instanceMethodOne的属性。此属性已添加到MyClass的原型对象中。但是,对此对象的引用已复制到[[prototype]]的{​​{1}}(a.k.a)__proto__属性,因此可以访问。

现在你的情况是所有实例都有自己的状态,这是在构造函数中创建的(只是一个普通函数),但它们共享添加到函数prototype属性中的状态。这就是你在Javascript中获得“类”的方法。