原型的细节

Details on prototypes

本文关键字:细节 原型      更新时间:2023-09-26

我是从Python来的,试着去理解什么是原型。有什么方法可以让我得到一个原型的python描述吗?这听起来有点像一个描述符有了一个init的孩子。另外,我听说Prototype在DOM上使用时往往会产生负面影响。这是真的吗?如果是,为什么?谢谢,我已经看了大量的文章和原型只是没有意义,我在这一点上!

在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]]属性。它将继续搜索原型(即继承)链,直到到达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的原型对象中。但是,对该对象的引用被复制到myInstance[[prototype]] (a.k.a __proto__)属性中,因此它是可访问的。

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