javascript - 不使用原型(prototype)向函数添加属性

标签 javascript

是否可以在不使用原型(prototype)的情况下向函数添加属性?我知道使用原型(prototype)您可以执行以下操作:

function Gadget(name, color) { 
    this.name = name; 
    this.color = color; 
    this.whatAreYou = function(){ 
    return 'I am a ' + this.color + ' ' + this.name; 
    }
}

如果没有原型(prototype)对象,可以实现同样的目标吗?

最佳答案

您所问的内容有点困惑。您当前没有为您的方法或属性使用原型(prototype)(无法从您的问题中判断您是否意识到这一点),并且如果您使用 new 从函数创建对象,那么该技术就可以正常工作像这样:

function Gadget(name, color) { 
    this.name = name; 
    this.color = color; 
    this.whatAreYou = function(){ 
        return 'I am a ' + this.color + ' ' + this.name; 
    }
}

var x = new Gadget("Faucet", "red");
x.whatAreYou();   // returns 'I am a red Faucet'

工作演示:http://jsfiddle.net/jfriend00/wPP7N/

当使用new运算符时,它会创建一个新对象并调用函数,并将this分配给新对象。添加到构造函数中 this 指向的对象的任何属性都会成为新对象的属性。

事实上,在您的示例中,具有动态值(如 namecolor)的属性通常在构造函数中这样分配,因为使用原型(prototype)没有什么优势它们是因为它们被分配了一个动态值。使用原型(prototype)分配诸如 whatAreYou 方法之类的方法具有性能优势,因为在构造函数时需要运行的代码较少 - 尽管差异并不大。

<小时/>

为了进行比较和对比,使用原型(prototype)定义方法的代码如下所示:

function Gadget(name, color) { 
    this.name = name; 
    this.color = color; 
}

Gadget.prototype.whatAreYou = function(){ 
    return 'I am a ' + this.color + ' ' + this.name; 
}

var x = new Gadget("Faucet", "red");
x.whatAreYou();   // returns 'I am a red Faucet'
<小时/>

如果你只是简单地调用该函数,如下所示:

Gadget();

然后,没有创建新对象,并且 this 将指向全局对象,或者将是 未定义(在严格模式下),因此属性不会打开特定于小工具的对象。

关于javascript - 不使用原型(prototype)向函数添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748737/

相关文章:

javascript - 如何将表单数据从reactjs发送到mvc asp.net中的 Controller

javascript - Html:折叠按钮充当表单中的表单提交按钮

javascript - 这个for循环应该做什么?

javascript - aria-label 和 aria-labelledby 之间的区别

javascript - 编辑和删除 angularjs 中的表格行

javascript - 如何在JS中记下-1次方的切线

javascript - MQTT.js - 如何处理连接错误?

PHP 不识别 ajax 调用

javascript - 在JavaScript中创建自定义UI框架的最佳做法

Javascript array.length 是 0 直到我执行alert()