使函数仅对其原型可用

Making a function only available to its prototypes

本文关键字:原型 函数      更新时间:2023-09-26

以下是我的代码:

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

有人能给我指一个正确的方向,告诉我怎么做吗?谢谢

创建"私有"成员/方法的唯一方法如下:

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中工作。这是一本非常值得注意的读物。

默认情况下,作为构造函数调用的函数返回一个普通的Object。您可以让它们返回其他类型的对象,但该对象不会从构造函数的原型继承。此外,您不能更改函数对象的[[Prototype]](忽略已弃用的proto属性)。

构造函数(它是一个函数)和由构造函数创建的对象可以具有相同方法的唯一方法是在它们的[[Prototype]]链中共享一个对象。这只能通过扩展Object.prototype来实现,因为这是Function和Object都可以共享的唯一对象。

此外,您不能阻止对对象的公共方法的访问。你可以模仿私人成员,但这是相当弱的模仿。但是,您可以使用方法检查调用对象是否是特定"类"的实例,例如

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中的任何这样的解决方案都很容易被欺骗,不可能以健壮的方式实现您想要的。