当前位置: 首页 > 面试题库 >

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

盖锐
2023-03-14
问题内容

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

构造方法

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() {}vsvarClass=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!"); }


 类似资料:
  • 问题内容: 在创建javascript对象时,我可以在构造函数或原型中放置方法声明。例如,说我想要一个具有Name属性和Bark方法的Dog类。我可以将Bark方法的声明放入构造函数中: 或者我可以作为方法放在原型对象上: 当我实例化Dog类型的对象时,两种方法似乎都可以正常工作: 我是否应该优先选择其中一种方法?使用一个相对于另一个有什么好处吗?在幕后,这两种方法最终会做完全一样的事情吗?大多数

  • 本文向大家介绍JavaScript中定义对象原型的两种使用方法,包括了JavaScript中定义对象原型的两种使用方法的使用技巧和注意事项,需要的朋友参考一下 第一种: 第二种: 个人比较喜欢第二种;第二种可以的原型中可以拓展各种方法,用起来比较顺手。 例如可以写: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 本文向大家介绍javascript构造函数以及原型对象的理解,包括了javascript构造函数以及原型对象的理解的使用技巧和注意事项,需要的朋友参考一下 以下是一个构造函数的例子 如果是实例方法,不同的实例化,它们引用的地址是不一样的,是唯一的。  另外一种编写原型对象的方法,通过字面量的方式创建原型对象,这里{}就是对象,是Object,new Object相对于{} 使用字面量的方式创新对象

  • 问题内容: 如果我有一个像这样的构造函数: 然后,我如何在与构造函数相同的类中的方法中使用变量c和d,因为尝试仅在方法中使用变量名似乎不起作用? 问题答案: 实际上,您的代码将无法编译- 无效。 我认为您的意思是:- 。 然后我如何在与构造函数相同的类中的方法中使用变量c和d 您不能这样做,因为您已将它们声明为局部变量,其范围在构造函数结束执行时终止。 您应该将它们声明为实例变量。

  • 我有一个用于父级的构造函数: 稍后,我使用关键字创建一个对象: 我正在尝试使用defineProperty添加属性 但是,当我试图访问时,它返回。同样,当我在控制台中打印整个对象时,该属性仍然保持。 我错在哪了?

  • 本文向大家介绍浅谈js构造函数的方法与原型prototype,包括了浅谈js构造函数的方法与原型prototype的使用技巧和注意事项,需要的朋友参考一下 把方法写在构造函数内的情况我们简称为函数内方法,把方法写在prototype属性上的情况我们简称为prototype上的方法。 •函数内的方法: 使用函数内的方法我们可以访问到函数内部的私有变量,如果我们通过构造函数new出来的对象需要我们操作