0

我试图在父对象中有私有变量时实现原型继承。

考虑这样的代码,

function Piece(isLiveArg) { 
    var isLive = isLiveArg; // I dont wish to make this field as public. I want it to be private.
    this.isLive = function(){ return isLive;}
}    

Piece.prototype.isLive = function () { return this.isLive(); }       

function Pawn(isLiveArg) { 
    // Overriding takes place by below assignment, and getPoints got vanished after this assignment.
    Pawn.prototype = new Piece(isLiveArg);           
}

Pawn.prototype.getPoints = function(){
    return 1;
}

var p = new Pawn(true);

console.log("Pawn live status : " + p.isLive());

但是,isLive 父对象上不存在私有变量,只有公共变量存在,那么继承可以很容易地实现这一点。就像这个链接一样,http://jsfiddle.net/tCTGD/3/

那么,当父对象中有私有变量时,我将如何实现相同的原型继承。

4

1 回答 1

5

您设置继承的方式是错误的。赋值Func.prototype应该在构造函数之外。然后,如果您将父构造函数应用于新的“子”对象,它也会将闭包分配给它。

例子:

function Piece(isLiveArg) { 
    var isLive = isLiveArg;
    this.isLive = function(){ return isLive;}
}

function Pawn(isLiveArg) { 
     // apply parent constructor
     Piece.call(this, isLiveArg);   
}

// set up inheritance
Pawn.prototype = Object.create(Piece.prototype);
Pawn.prototype.constructor = Pawn;

Pawn.prototype.getPoints = function(){
    return 1;
}

查看使用 `Object.create` 进行继承的好处,了解为什么Object.create设置继承更好。

尝试创建访问“私有属性”的原型函数是没有意义的。只有在构造函数中定义的闭包才能访问这些变量。

于 2013-08-02T17:42:21.660 回答