0

这是我的代码的样子:

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只需要在函数本身及其原型中可用,但这不起作用。

有人可以指出我正确的方向并告诉我如何做到这一点吗?谢谢。

4

2 回答 2

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 的这篇文章将帮助您了解公共、私有和特权成员/方法在 Javascript 中的工作方式。这是一本非常推荐的读物。

于 2012-08-19T09:54:18.897 回答
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 中的任何此类解决方案都很容易被欺骗,不可能以一种健壮的方式做你想做的事。

于 2012-08-19T13:39:09.297 回答