使功能仅适用于其原型

时间:2012-08-19 09:50:49

标签: javascript function methods prototype

以下是我的代码:

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

有人能指出我正确的方向并告诉我该怎么做吗?感谢。

2 个答案:

答案 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中的任何此类解决方案都很容易被欺骗,因此无法以强大的方式执行您想要的操作。