具有自己的集合名称的 JS 原型函数扩展
JS-prototype functionextension with own Collection Name
我想用一些新功能扩展所有 SVGElement。
例如:
SVGElement.prototype.logType= function () {
console.log('I am a SVGelement from type: ' + this.nodeName);
}
如果 svgText 是一个 svgText-Objekt 并且我调用 svgText.logType()
这工作正常... -> 日志是 "I am a SVGelement form type: svgText"
但我希望我的所有函数都带有前缀 my。
我试过了:
SVGElement.my= {};
SVGElement.prototype.my.logType= function () {
console.log('I am a SVGelement from type: ' + this.nodeName);
}
问题是,当我调用 svgText.my.logType() 时,"this" 指向 "my"-Objekt,而不是 svgText-Object。
有办法吗?感谢您的帮助,对不起我的英语 ;)
如果你想在你所做的所有添加中使用 "my" 前缀,到目前为止最简单的方法是将其作为方法名称的一部分:
SVGElement.prototype.myLogType = function() { /*...*/ };
// ------------------^^
但一般来说,不要使用直接赋值在用作原型的对象上创建新方法,它会创建一个可枚举的属性,这往往会出现问题。相反,使用 Object.defineProperty
并且不要使新的 属性 可枚举(默认情况下它将是不可枚举的)。
Object.defineProperty(SVGElement.prototype, "myLogType", {
value: function() { /*...*/ },
writable: true,
configurable: true
});
然而,可以做你想做的事,只是(稍微)低效和麻烦:使my
成为具有访问函数的属性并自定义生成您 return 第一次在实例上使用的对象。
查看评论:
// Stand-in for SVGElement for the example
function FakeElement(id) {
this.id = id;
}
// An object with the methods we want to add
var ourMethods = {
logText: function() {
return this.id;
}
};
// Add our "my" property
Object.defineProperty(FakeElement.prototype, "my", {
get() {
// If we're being called on the prototype object itself, don't
// do anything and just return null
if (this === FakeElement.prototype) {
return null;
}
// Define 'my' on this specific object with bound functions
console.log("Creating 'my' for element id = " + this.id);
var obj = this;
var my = {};
Object.keys(ourMethods).forEach(function(key) {
my[key] = ourMethods[key].bind(obj);
});
Object.defineProperty(this, "my", {value: my});
return my;
}
});
// Test it
var f1 = new FakeElement(1);
var f2 = new FakeElement(2);
console.log(f1.my.logText());
console.log(f2.my.logText());
console.log(f1.my.logText());
console.log(f2.my.logText());
这是为了清楚而不是简洁而写的,如果我们利用 ES2015+ 对 JavaScript 的改进可能会更简洁,但希望它能帮助您入门...
我想用一些新功能扩展所有 SVGElement。
例如:
SVGElement.prototype.logType= function () {
console.log('I am a SVGelement from type: ' + this.nodeName);
}
如果 svgText 是一个 svgText-Objekt 并且我调用 svgText.logType() 这工作正常... -> 日志是 "I am a SVGelement form type: svgText"
但我希望我的所有函数都带有前缀 my。 我试过了:
SVGElement.my= {};
SVGElement.prototype.my.logType= function () {
console.log('I am a SVGelement from type: ' + this.nodeName);
}
问题是,当我调用 svgText.my.logType() 时,"this" 指向 "my"-Objekt,而不是 svgText-Object。
有办法吗?感谢您的帮助,对不起我的英语 ;)
如果你想在你所做的所有添加中使用 "my" 前缀,到目前为止最简单的方法是将其作为方法名称的一部分:
SVGElement.prototype.myLogType = function() { /*...*/ };
// ------------------^^
但一般来说,不要使用直接赋值在用作原型的对象上创建新方法,它会创建一个可枚举的属性,这往往会出现问题。相反,使用 Object.defineProperty
并且不要使新的 属性 可枚举(默认情况下它将是不可枚举的)。
Object.defineProperty(SVGElement.prototype, "myLogType", {
value: function() { /*...*/ },
writable: true,
configurable: true
});
然而,可以做你想做的事,只是(稍微)低效和麻烦:使my
成为具有访问函数的属性并自定义生成您 return 第一次在实例上使用的对象。
查看评论:
// Stand-in for SVGElement for the example
function FakeElement(id) {
this.id = id;
}
// An object with the methods we want to add
var ourMethods = {
logText: function() {
return this.id;
}
};
// Add our "my" property
Object.defineProperty(FakeElement.prototype, "my", {
get() {
// If we're being called on the prototype object itself, don't
// do anything and just return null
if (this === FakeElement.prototype) {
return null;
}
// Define 'my' on this specific object with bound functions
console.log("Creating 'my' for element id = " + this.id);
var obj = this;
var my = {};
Object.keys(ourMethods).forEach(function(key) {
my[key] = ourMethods[key].bind(obj);
});
Object.defineProperty(this, "my", {value: my});
return my;
}
});
// Test it
var f1 = new FakeElement(1);
var f2 = new FakeElement(2);
console.log(f1.my.logText());
console.log(f2.my.logText());
console.log(f1.my.logText());
console.log(f2.my.logText());
这是为了清楚而不是简洁而写的,如果我们利用 ES2015+ 对 JavaScript 的改进可能会更简洁,但希望它能帮助您入门...