Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中,如何使用私有方法向对象添加/执行新方法?_Javascript_Object_Scope - Fatal编程技术网

在javascript中,如何使用私有方法向对象添加/执行新方法?

在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.

希望使用对象的私有方法扩展define和/或执行新方法,就像我在原始声明中定义方法一样,但这些新方法只适用于要执行一次的对象,而不适用于Klass本身

例如:

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是特定于实例的,在每个实例中都可能不同。感谢链接!太多的语言在太多的年-模糊发生感谢链接!多年来使用了太多的语言——模糊性就会发生