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