Obj ['var']和Obj.prototype.var有区别吗?

时间:2012-12-23 06:24:38

标签: javascript oop

我不太确定如何以单词术语陈述问题,因为我不知道该怎么称呼它 - > Obj['var] = something

我相信标题总结起来,以这两种不同的方式声明对象的变量或函数是否有任何区别,或者它们是相同的,做同样事情的不同方式。

修改

我的代码示例:

对于令人困惑的变量名称,请注意大写字符:/

buttons = document.getElementsByClassName('button');
Buttons = new Button_Objs();

for (i = 0 ; i < buttons.length ; i++){
    button = buttons[i];
    Buttons['button' + i] = new Button(button);
}

var Button = function(elem){
    this.buttonType = elem.getAttribute('button-type');
    if (this.buttonType = 'safety'){
        constructSafetyButton(elem, this);
    }
}

function constructSafetyButton(elem, button){

    button['setState'] = function(state){//do something}

}

在尝试使用button.prototype.setState = func...

时,我被浏览器大吼大叫

2 个答案:

答案 0 :(得分:4)

Obj['var'] = ...(以及此Obj.var = ...)为Obj引用的对象分配属性。

示例:

var obj = {};
obj['foo'] = 'bar';
// or obj.foo = 'bar';
console.log(obj.foo); // shows 'bar'

除非Obj.prototype.var = ...功能,否则

Obj很可能会抛出错误。函数有一个名为prototype的特殊属性,当函数作为构造函数调用时,所有新实例都会从该属性继承,即使用new关键字调用。

示例:

function Foo() {}
Foo.prototype.bar = 'baz';

var foo = new Foo();
console.log(foo.bar); // shows 'baz'

由于函数本身也是对象,因此您也可以为它们分配属性

Foo.someProp = 'someVal';

但这不会影响Foo创建的实例。新实例仅从Foo.prototype继承:

console.log(foo.someProp); // shows undefined

虽然两个语句都赋予对象属性(在这方面它们是“相同的”),但结果完全不同。

如果您想了解有关JavaScript中原型继承的更多信息,请查看MDN - Details of the Object ModelMDN - Inheritance and the prototype chain

答案 1 :(得分:3)

根据标题中的问题,它们没有区别。

Obj['var'] = something

相当于:

Obj.var = something;

这与在某个对象的prototype属性上设置值完全不同。

Obj.prototype.var = somthing