使用原型相对于直接在构造函数中定义方法的优势?[重复]

2020/10/04 04:01 · javascript ·  · 0评论

我想知道使用这些方法相对于其他方法是否有任何优势,我应该走哪条路?

构造方法:

var Class = function () {

    this.calc = function (a, b) {
        return a + b;
    };

};

原型方法:

var Class = function () {};

Class.prototype.calc = function (a, b) {
    return a + b;
};

我不喜欢这样,使用原型将方法定义与类分开,并且我不知道是否有任何特殊原因我应该仅在第一种方法上使用它。

此外,与仅使用函数定义相比,使用函数文字来定义“类”有什么好处:

var Class = function () {};

function Class () {};

谢谢!

通过原型链继承的方法可以针对所有实例进行通用更改,例如:

function Class () {}
Class.prototype.calc = function (a, b) {
    return a + b;
}

// Create 2 instances:
var ins1 = new Class(),
    ins2 = new Class();

// Test the calc method:
console.log(ins1.calc(1,1), ins2.calc(1,1));
// -> 2, 2

// Change the prototype method
Class.prototype.calc = function () {
    var args = Array.prototype.slice.apply(arguments),
        res = 0, c;

    while (c = args.shift())
        res += c;

    return res; 
}

// Test the calc method:
console.log(ins1.calc(1,1,1), ins2.calc(1,1,1));
// -> 3, 3

请注意如何更改应用于两个实例的方法?这是因为ins1ins2共享相同的calc()功能。为了使用在构造期间创建的公共方法来执行此操作,您必须将新方法分配给已创建的每个实例,这是一项艰巨的任务。这是因为ins1并且ins2将具有自己的,单独创建的calc()功能。

在构造函数内部创建方法的另一个副作用是性能较差。每次构造函数运行时,都必须创建每个方法。原型链上的方法创建一次,然后由每个实例“继承”。不利的一面是,公共方法可以访问“私有”变量,而继承方法是不可能的。

至于您的function Class() {}vsvar Class = function () {}问题,在执行之前,前者已“提升”到当前作用域的顶部。对于后者,将悬挂变量声明,而不是赋值。例如:

// Error, fn is called before the function is assigned!
fn();
var fn = function () { alert("test!"); } 

// Works as expected: the fn2 declaration is hoisted above the call
fn2();
function fn2() { alert("test!"); }

原型方法的优点是效率。calc()所有Class对象之间共享一个功能对象(我的意思是指通过调用Class构造函数创建的对象)。另一种方法(在构造函数中分配方法)为每个Class对象创建一个新的函数对象,在调用Class构造函数时使用更多的内存并占用更多的处理时间但是,这种方法确实有一个优势:该calc()方法可以访问构造函数中的局部变量,您可以利用它来发挥自己的优势:

function Class() {
    var calcCallCount = 0;

    this.calc = function (a, b) {
        ++calcCallCount;
        alert("Calc called " + calcCallCount + " times");
        return a + b;
    };
};

关于var Class = function() {...}vs function Class() {...},我通常更喜欢后者,因为它意味着函数具有名称,这在调试时很有用。另一个不同之处是,悬挂了后一个版本(函数声明),这意味着它在定义它的范围内的任何地方都可用,而不仅仅是在定义之后。但是,有些人喜欢在各处使用前者(一个函数表达式)。

var YourClass = function(){
  var privateField = "somevalue";
  this.publicField = "somevalue";
  this.instanceMethod1 = function(){
     //you may access both private and public field from here:
     //in order to access public field, you must use "this":
     alert(privateField + "; " + this.publicField);
  };
}

YourClass.prototype.instanceMethod2 = function(){
  //you may access only public field 2 from this method, but not private fields:
  alert(this.publicField);
  //error: drawaback of prototype methods:
  alert(privateField);  
};

原型方法的优点:

  1. 当您通过原型定义方法时,它们在所有YourClass实例之间共享。因此,与在构造函数中定义方法相比,此类实例的总大小为<;有测试表明通过原型的方法定义如何减少html页面的总大小,并因此降低其加载速度。

  2. 通过原型定义的方法的另一个优势-当您使用继承的类时,您可以覆盖此类方法,并且在派生类的重写方法中,可以使用具有相同名称但在构造函数中定义的方法来调用基类的方法,你不能做这个。

本文地址:http://javascript.askforanswer.com/shiyongyuanxingxiangduiyuzhijiezaigouzaohanshuzhongdingyifangfadeyoushizhongfu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!