在javascript中,如何使用私有方法向对象添加/执行新方法?
希望使用对象的私有方法扩展define和/或执行新方法,就像我在原始声明中定义方法一样,但这些新方法只适用于要执行一次的对象,而不适用于Klass本身 例如:在javascript中,如何使用私有方法向对象添加/执行新方法?,javascript,object,scope,Javascript,Object,Scope,希望使用对象的私有方法扩展define和/或执行新方法,就像我在原始声明中定义方法一样,但这些新方法只适用于要执行一次的对象,而不适用于Klass本身 例如: var Klass = function() { var privateFn = function() { return 15 }; this.publicFn1 = function() { return privateFn()+1; }; } var k = new Klass(); console.
var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
}
var k = new Klass();
console.log( k.publicFn1() ); // prints 16
假设我希望在Klass上创建和/或执行一个新方法,sum2()
,该方法将在privateFn
中添加2
我已经试过了
k.publicFn2 = function() { return privateFn()+2 }
console.log( k.publicFn2() );
这很有道理,它不起作用,但什么起作用呢
需要注意的是,由于函数非常长,因此试图维护
privateFn()
的语法,而不是self.privateFn()
——这可能要求太高,但希望如此。ECMAScript中没有private这类东西
var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
}
privateFn
是一个局部变量,publicFn1
根据作用域规则(和闭包)可以访问它
您无法访问privateFn
功能范围之外的Klass
如果您想访问功能范围之外的privateFn
Klass
,则必须通过代理将其公开或将其进一步注入范围链
代理将类似于
this._private = function() {
return privateFn;
}
var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
this.uid = Klass.uid++;
Klass.instances[this.uid] = {
privateFn: privateFn
};
}
Klass.uid = 0;
Klass.instances = [];
k.publicFn2 = function() { return Klass.instances[this.uid].privateFn()+2 }
进一步向范围链的上游注入
this._private = function() {
return privateFn;
}
var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
this.uid = Klass.uid++;
Klass.instances[this.uid] = {
privateFn: privateFn
};
}
Klass.uid = 0;
Klass.instances = [];
k.publicFn2 = function() { return Klass.instances[this.uid].privateFn()+2 }
两者都很难看
它们难看的原因是您正在模仿经典的OO
请改用原型OO
在ECMAScript中没有私有的东西
var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
}
privateFn
是一个局部变量,publicFn1
根据作用域规则(和闭包)可以访问它
您无法访问privateFn
功能范围之外的Klass
如果您想访问功能范围之外的privateFn
Klass
,则必须通过代理将其公开或将其进一步注入范围链
代理将类似于
this._private = function() {
return privateFn;
}
var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
this.uid = Klass.uid++;
Klass.instances[this.uid] = {
privateFn: privateFn
};
}
Klass.uid = 0;
Klass.instances = [];
k.publicFn2 = function() { return Klass.instances[this.uid].privateFn()+2 }
进一步向范围链的上游注入
this._private = function() {
return privateFn;
}
var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
this.uid = Klass.uid++;
Klass.instances[this.uid] = {
privateFn: privateFn
};
}
Klass.uid = 0;
Klass.instances = [];
k.publicFn2 = function() { return Klass.instances[this.uid].privateFn()+2 }
两者都很难看
它们难看的原因是您正在模仿经典的OO
请改用原型OO
Javascript是一种基于原型的面向对象语言。这意味着,如果希望使用特定于实例的变量,可以通过扩展该对象的prototype对象来实现。以任何其他方式使用它都是不自然的,并且会导致像您这样的问题,需要极端的黑客才能克服。为什么不按原意使用这种语言呢 您的代码的正确结构更像以下内容:
function Klass(nr) {
this.nr = nr;
};
Klass.prototype.publicFn = function() {
alert(this.nr);
};
var inst = new Klass(13);
inst.publicFn();
JS中没有私有函数,也不会有私有函数。您可以“破解”类似的效果,但代价是要么自己破解,要么使用其他库
试图改变语言以适合你是没有意义的。相反,您应该按原样学习该语言。Javascript是一种基于原型的面向对象语言。这意味着,如果希望使用特定于实例的变量,可以通过扩展该对象的prototype对象来实现。以任何其他方式使用它都是不自然的,并且会导致像您这样的问题,需要极端的黑客才能克服。为什么不按原意使用这种语言呢 您的代码的正确结构更像以下内容:
function Klass(nr) {
this.nr = nr;
};
Klass.prototype.publicFn = function() {
alert(this.nr);
};
var inst = new Klass(13);
inst.publicFn();
JS中没有私有函数,也不会有私有函数。您可以“破解”类似的效果,但代价是要么自己破解,要么使用其他库
试图改变语言以适合你是没有意义的。相反,你应该按原样学习语言。你想做的不是Javascript。你想做的不是Javascript。你完全同意使用“原样语言”,但Javascript不止一次让我惊喜不已实例特定变量不存在于原型上。原型方法依赖于原型。原型上的属性/变量/值由链中具有该原型且不特定于实例的所有对象共享。可能措辞不太好,但我的意思是,当您有任意数量的实例时,您可以在原型函数中使用此.variable,其中this.variable是特定于实例的,在每个实例中都可能有所不同。我非常同意使用“原样语言”,但javascript不止一次让我惊喜不已实例特定变量不存在于原型上。原型方法依赖于原型。原型上的属性/变量/值由链中具有该原型且不特定于实例的所有对象共享。可能措辞不太好,但我的意思是,当您有任意数量的实例时,您可以在原型函数中使用此.variable,其中this.variable是特定于实例的,在每个实例中都可能不同。感谢链接!太多的语言在太多的年-模糊发生感谢链接!多年来使用了太多的语言——模糊性就会发生