Javascript中object.property Name和object [“property Name”]之间的区别[重复]

Posted

技术标签:

【中文标题】Javascript中object.property Name和object [“property Name”]之间的区别[重复]【英文标题】:Different between object.propertyName and object["propertyName"] in Javascript [duplicate] 【发布时间】:2012-01-31 07:13:15 【问题描述】:

最近在“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

有人能解释一下为什么会这样吗?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

发生的事情是name 是一个变量,不能直接与点符号一起使用。为了更好地说明这个问题,假设您为名称传递了一个值"newMethod"。现在当你这样做时:

this.prototype[name] = func;

...相当于写:

this.prototype["newMethod"] = func;

但是当你这样做时:

this.prototype.name = func;

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

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

this.prototype.newMethod = func;

但是您不能使用点符号和name 变量来表达这一点(可能通过作弊和使用字符串连接和eval() 除外)。在这种情况下,您必须改用数组下标表示法。

【讨论】:

【参考方案2】:

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

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

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

myclass["name"] = function()  

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

还是我错过了什么?

【讨论】:

【参考方案3】:

name是一个变量,当你使用this.prototype.name时,它和你调用this.prototype["name"]一样,而不是你想象的this.prototype[name]

【讨论】:

以上是关于Javascript中object.property Name和object [“property Name”]之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

javascript中valueOf()方法的用法?

javascript 从一个数组中 删除 一个数组

javascript - 使用另一个函数中的变量 javascript - '今天未在对象中定义'

javascript中如何获得ul中所有列表项的值

javascript中Function.prototype的问题

javascript中Function 与Object的关系