我最近从" 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
有人可能会澄清为什么会这样吗?
提前感谢您的帮助。
答案 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]
。