我一直在学习更多有关javascript原型继承的知识。我知道关于是否扩展本地对象存在一些激烈的争论,我想在这个问题上完全支持整个辩论。
是否可以在javascript中仅扩展后代对象?
要扩展所有对象,我可以这样做:
Object.prototype.size = function(){
var length = 0;
for(var i in this){
if(this.hasOwnProperty(i)){
length++;
}
}
return this;
}
但问题是它扩展了所有对象。我想做的是:
var MyNameSpace = function(){
};
MyNameSpace.Object.prototype.size = function(){
var length = 0;
for(var i in this){
if(this.hasOwnProperty(i)){
length++;
}
}
return this;
}
这样我只会在我的全局对象范围内扩展本机对象。
任何建议都会非常感谢
更新:
在回应一些评论时,我正在添加更多代码来澄清我正在尝试做的事情。
我想我可能没有正确地表达我的问题,或者我的想法可能不正确,但我希望能够做到的是:
var my = new MyNameSpace();
var my.name = {firstName : 'Hello', lastName : 'World'};
var nameCount = my.name.size(); // 2
您提供的代码将允许我获取我创建的每个MyNameSpace对象的大小,但不能获取作为MyNameSpace对象属性的对象文字
答案 0 :(得分:1)
您可以使用“伪古典”继承风格来实现它:
var MyNameSpace = function() {
this.v1 = null;
this.v2 = null;
}
MyNameSpace.prototype.size = function() {
var length = 0;
for(var i in this){
if(this.hasOwnProperty(i)){
length++;
}
}
return this;
}
var my = new MyNameSpace(); // create new object based on MyNameSpace
my.size(); // length would be 2
您在函数对象的prototype
上定义的内容将由通过new
运算符创建的所有函数对象继承。
根据您添加的要求更新了代码,
var obj = {};
var MyNameSpace = function(props) {
for(var name in props) {
this[name] = props[name];
}
}
MyNameSpace.prototype.size = function() {
var length = 0;
for(var i in this){
if(this.hasOwnProperty(i)){
length++;
}
}
return this;
}
obj.name = new MyNameSpace({firstName : 'Hello', lastName : 'World'});
obj.name.size(); // length would be 2
答案 1 :(得分:0)
在您的代码中
var my = new MyNameSpace();
var my.name = {firstName : 'Hello', lastName : 'World'};
var nameCount = my.name.size(); // 2
my.name
显然可以从my
遍历,但事实恰恰相反。这意味着无法从my
访问my.name
的属性,my
的原型链中无法找到my.name
。如果您不想直接从MyNameSpace继承,则必须明确地“挂起”您想要继承的任何函数。
你可以做到
my.name.size = my.size;
或者(不必实例化MyNameSpace):
my.name.size = MyNameSpace.prototype.size;
如果您只有很少的功能可以“继承”。或者你可以在MyNameSpace中定义一个继承函数,如下所示:
MyNameSpace.prototype.addToNameSpace = function(obj) {
obj.size = this.size;
// obj.propertyI = this.propertyI, etc.
}
请注意,我不在此处使用for..in
,因为这也会添加addToNameSpace
功能。
希望这有帮助