在不使用原型的情况下添加属性

时间:2013-11-03 00:59:52

标签: javascript

是否可以在不使用原型的情况下向函数添加属性?我知道原型你可以做以下事情:

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

没有原型对象可以实现同样的目标吗?

2 个答案:

答案 0 :(得分:1)

对于你所问的问题,有一点混乱。您目前没有使用原型(无法通过您的问题判断您是否意识到)您的方法或属性,如果您使用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的属性通常在构造函数中就像这样分配,因为使用原型对它们没有什么好处,因为它们被分配了动态价值。使用原型分配诸如whatAreYou方法之类的方法具有性能优势,因为在构造函数时必须运行较少的代码 - 尽管差异不是很大。


为了比较和对比,使用原型来定义方法的代码如下所示:

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将指向全局对象或将undefined(在严格模式下),因此属性不会出现在特定于Gadget的对象上。

答案 1 :(得分:0)

查看您的问题的评论(您实际上并未使用原型),但只是为了帮助您理解,使用原型将如下所示:

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

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