在Javascript中,object.propertyName和object [" propertyName"]之间有所不同

时间:2012-01-01 06:17:43

标签: javascript

我最近从" JavaScript the Good Parts"一直在学习Js,并根据我的理解

Object.propertyName产生与Object["propertyName"]相同的结果(如果我不对,请纠正我并描述两者的区别)。

我试图扩充Function.prototype以使方法可用于所有函数,如下所示:

Function.prototype.method = function (name, func) {
            this.prototype[name]= func;
    };

它工作正常。但是,当我用this.prototype[name]替换this.prototype.name时,它将无法按预期运行!

这就是我测试它的方式:

 Number.method("myRoundFunction", function () {
        return Math[this < 0 ? "ceil" : "floor"](this);
    });
    console.log((-10 / 3).myRoundFunction());

这显示使用this.prototype[name]时的预期值(-3),但

  

( - 3.3333333333333335).myRoundFunction不是函数

将其更改为this.prototype.name

有人可能会澄清为什么会这样吗?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

发生的事情是name是变量,不能直接用点表示法使用。为了更好地说明问题,我们假设您为名称传递值"newMethod"。现在你做的时候:

this.prototype[name] = func;

......相当于写作:

this.prototype["newMethod"] = func;

但是当你这样做时:

this.prototype.name = func;

...您要分配对象的name属性,而不是newMethod属性。在上面的语句中,根本没有引用您在参数name下传递的变量。

将执行您期望的分配的语法是:

this.prototype.newMethod = func;

但你不能用点符号和name变量来表达(除了欺骗和使用字符串连接和eval())。在这种情况下,您必须改为使用array-subscript符号。

答案 1 :(得分:3)

Prototype定义了JS类的定义;而像Number.parse这样的东西是一个类型的直接函数(类似于静态方法)。如果我这样做:

myclass.prototype["name"] = function() { }

我正在向该类的下一个实例添加一个方法,而:

myclass["name"] = function() { }

将函数直接添加到类对象,而不是myclass的下一个实例。我认为当我看到Number.method的定义时会发生这种情况?

或者我错过了什么?

答案 2 :(得分:2)

name是一个变量,当您使用this.prototype.name时,它与您调用this.prototype["name"]相同,而不是您认为的this.prototype[name]