2015-07-21 85 views
1

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

+0

我想_a原型的pythonic描述应该是['prototype.py'](https://github.com/airportyh/prototype.py),但是这是原型到_Python_的实现。 _古典语言_以与古典_Class_不同的方式进行代码重用,这不是一个简单的翻译。 –

+0

@PaulS。谢谢,prototype.py的一个快速谷歌带我到一个非常有用的网站,它听起来像一个并不遥远。纠正我,如果我错了,但你可以定义变量和设置默认值(如init)。此外,您可以添加类似于部分的自定义函数或使用装饰器或覆盖内置函数(如print)(类似于描述符覆盖__getattr__的能力)? –

+0

我也试图在这方面找到一些见解,并且偶然发现了这篇文章http://aaditmshah.github.io/why-prototypal-inheritance-matters/。希望能帮助到你。 – bbill

回答

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]]财产。它将继续搜索原型(又名继承)链,直到它达到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]](又名)__proto__属性中,因此它是可访问的。

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

+0

将这些事情称为类并不好,称它们为_Constructors_ –

+0

查看构造函数来解释JavaScript原型......也许不是最好的主意。 –

+0

@Kyll什么是解释它们的更好方法?关于对象蓝图的一些过于复杂的隐喻? ;)请随时添加您自己的答案。我会高兴地投票。这只是我解释它的方式,它在技术上是准确的。 – LukeP