以下是我的代码:
Random = function(name) {
this.name = name;
this.addSomething = function(a, b) {
return a + b;
}
}
Random.prototype.addStuff = function(a, b, c, d) {
return this.addSomething(a, b) + this.addSomething(b, d);
}
我需要this.addSomething
仅在函数本身及其原型中可用,但这不起作用。
有人能指出我正确的方向并告诉我该怎么做吗?感谢。
答案 0 :(得分:2)
制作“私人”成员/方法的唯一方法是:
Random = function(name) {
this.name = name;
function add_something(a, b) {
return a + b;
}
this.addStuff = function(a, b, c, d) {
return add_something(a, b) + add_something(b, d);
}
}
编辑:正如RobG在他的回答中提到的,Douglas Crockford的this article将帮助您了解公共,私有和特权成员/方法如何在Javascript中工作。这是一个非常推荐的阅读。
答案 1 :(得分:1)
作为构造函数调用的函数默认返回一个普通的Object。您可以让它们返回其他类型的对象,但该对象不会从构造函数的原型继承。此外,您无法更改函数对象的[[Prototype]]
(忽略已弃用的proto属性)。
构造函数(它是一个函数)和构造函数创建的对象可以使用相同方法的唯一方法是共享一个[[Prototype]]
链中的对象。这只能通过扩展Object.prototype来完成,因为这是函数和对象可以共享的唯一对象。
此外,您无法阻止访问对象的公共方法。您可以模仿private members,但这是非常弱的模拟。但是,您可以使用方法检查调用对象是特定“类”的实例,例如
function Foo(){}
Foo.prototype.bar = function() {
return this instanceof Foo? 'success' : 'failure';
}
var foo = new Foo();
var blah = {};
// Call bar method of an instance of Foo
alert(foo.bar()); // success
// Call bar method on some other object
alert(Foo.prototype.bar.call(blah)); // failure
javascript中的任何此类解决方案都很容易被欺骗,因此无法以强大的方式执行您想要的操作。