在构造函数中声明javascript对象方法与在Prototype中声明

在构造函数中声明javascript对象方法与在Prototype中声明

在创建javascript对象时,我可以将方法声明放入构造函数或原型中。例如,假设我想要一个具有name属性和Bark方法的Dog类。我可以将Bark方法的声明放入构造函数中:

var Dog = function(name) {
    this.Name = name;
    this.Bark = function() {
        alert(this.Name + " bark");
    };}

或者我可以把它作为原型对象的一种方法:

var Dog = function(name) {
    this.Name = name;}Dog.prototype.Bark = function() {
    alert(this.Name + " bark");};

当我实例化Dog类型的对象时,这两种方法似乎都很好:

var dog = new Dog("Fido");dog.Bark();  //Both approaches show "Fido bark"

我应该更喜欢这些方法中的一种而不是另一种吗?使用一种比另一种更有好处吗?在幕后,这两种方法最终会做完全相同的事情吗?大多数人倾向于采用哪种方法?

谢谢你的帮助。


翻翻过去那场雪
浏览 321回答 3
3回答

小怪兽爱吃肉

两者是不同的:第一个将存储对该方法的引用。只在原型对象上,而第二个解决方案则将方法存储在各物体的。这意味着每个对象将包含一个额外的指针,因此每个对象占用更多的内存。每个对象方法允许该方法引用构造函数中的变量(闭包),因此它允许您访问一些无法从原型方法访问的数据。最后,一个原型方法可以后来变了,那就是你可以重新定义Bark在运行时,对Prototype对象进行此更改,此更改将适用于该原型的所有对象(因为方法总是通过原型查找)。

绝地无双

我看到的绝大多数javascript代码都使用原型方法。我认为有三个原因,我可以想到我的头顶。第一,避免让每个类都成为一个巨大的构造函数:构造函数逻辑在构造函数中,其他方法的逻辑在其他地方声明-这主要是一个清晰的东西/关注点的分离,但是在javascript中,你需要尽可能的清晰。二是效率。在构造函数中声明方法时,您将为对象的每个实例创建一个函数对象的新实例,并将构造函数的作用域绑定到这些函数中的每一个(也就是说,它们可以将参数引用到构造函数,只要该对象存在,构造函数就永远不可能被GC_d_当您在原型上声明方法时,所有实例都使用函数对象的一个副本-Prototype属性不会复制到实例中。第三个原因是,当您使用Prototype方法时,可以各种方式“扩展”一个类,例如Backbone.js和CoffeeScript的类构造所使用的原型链接。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript