如果您打开this JSFiddle,则应在Firebug / Chrome开发工具中看到,在调用x.method
时会引发异常,因为method
不存在。
但是,如果您在控制台中运行Object.method
或Function.method
,您会发现它们确实存在于各自的原型中。
我确信它只是一个简单的继承问题,但此时我已经超越了method
方法没有冒泡到x
对象的原因。
代码如下:
// Crockford's Object.create shim
if (typeof Object.create !== 'function') {
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
// Add a method creation function to the Function prototype
// Note that on this line I've also tried:
// Object.prototype.method = Function.prototype.method = function (name, func) {
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
// Create our object
var x = Object.create({});
// Add common methods to the prototype of our new object
x.method('logNumber', function (num) {
console.log(num);
});
// Try it out
x.logNumber(6);
答案 0 :(得分:2)
[注意] jsfiddle目前似乎已经停止,所以我无法检查您的代码
此功能:
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
为函数原型添加了一个方法。使用构造函数创建Object:使用new
关键字调用的函数将创建它构造的Object的实例。在Object.create
'shim'中,构造函数是F
,但是shim返回它的实例(new F()
)。
变量x
不是构造函数,而是实例。您只能从Function.prototype中调用method
,因此x.method
为undefined
。
不使用Object.create
可能会告诉您它是如何运作的:
function X(){}; //=> new X will create an instance of an empty Object
X.method('logNumber', function (num) {
console.log(num);
}); //=> call 'method' from the constructor: now it's working
var x = new X; //=> create an instance
x.logNumber(6); //=> behold!
答案 1 :(得分:0)
这可行,但没有控制台
Object.prototype.method = function (name, func) {
this[name] = func;
};
答案 2 :(得分:0)
我相信您需要this.prototype[name] = func
而不是this[name] = func
。另外我猜你想要这个对象:
Object.prototype.method = function (name, func) {
this.[name] = func
return this
}
鉴于您已经在使用Crockford的对象,如果您不需要对所有Object
使用此选项,则可以执行以下操作:
var X = { method: function (name, func) {
this[name] = func
return this
}
var x = Object.create(X)
答案 3 :(得分:0)
var x,x是一个Object,而不是一个函数,这就是你需要使用
的原因Object.prototype.method = function (name, func) {
this[name] = func;
return this;
};