【问题标题】:Add Non-Inheriting function to inherited class - Javascript向继承的类添加非继承函数 - Javascript
【发布时间】:2014-02-25 17:49:42
【问题描述】:

我是 Javascript 中的面向对象编程的新手。昨天我读到了 javascript 中的 prototypeprototype.constructor 以及它们如何在 Javascript 继承中发挥作用。

我制作了一个 javascript 函数,继承自其中一个父函数。但是我希望这个孩子的一些方法不要被它的子函数继承。

也就是说,

function A //parent
|
|`callA()
 `makeA()

这是主要的父类。

function B //child of A
|
|` callB() //can be inherited
|` makeB() //cannot be inherited
|` callA() //inherited
 ` makeA() //inherited

B是我要写的子函数。

function C //child of B
|
|` callC();
|` makeC();
|` callB();
|` callA();
 ` makeA();

我是这样写的:

function A(){}
A.prototype.callA = function()
{
    alert('CallA');
}
A.prototype.makeA = function()
{
    alert('makeA');
}

function B(){
    function makeB(){    //This is not working I am not able to call makeB with B's object
        alert('makeB'); 
    }   
}
B.prototype = new A();
B.prototype.constructor = B;
B.prototype.callB = function()
{
    alert('callB');
}
function C(){}
C.prototype = new C();
C.prototype.constructor = C;
C.prototype.callC = function()
{
    alert('callC');
}
C.prototype.makeC = function()
{
    alert('makeC');
}

$(document).ready(function(){
    var b = new B();
    var c = new C();
    $(document).click(function(){
        c.callB();
        c.callC();
        b.callB();
        b.makeB(); //not being called
    });
});

如何在 JS 继承中做这部分。派生对象的私有函数。

【问题讨论】:

  • 为什么要从C 中隐藏makeB?像这样打破 Liskov 替换原则是一种代码味道。
  • @missingno:你可能需要它。我不确定Liskov Substitution。但是在java中我一直在这样做。您可能需要一些不想与子类共享的功能。对吧。?
  • @missingno LSP 被高估了。摒弃严格的子类型关系和当前的 OOP“规范”!
  • @Veer “扁平化”关系树怎么样?每种类型都可以有不同的原型,与其他类型分开(即没有一个是“子类型”)——只需将每种类型应该具有的方法手动连接到适当的“元”函数存储(或者实际上是它们所在的第一个原型)已定义)。
  • @Veer 就是代码看起来和上面一样,但是B.prototype.makeB = function ..去掉原型链之后呢?那么它就不会被其他原型“继承”。

标签: javascript jquery inheritance


【解决方案1】:

您可以做的一件事是将makeB 方法作为B 构造函数的一部分添加到您的实例中,而不是将其放入将从C 继承的原型中:

function B(){
   this.makeB = function(){
     //..
   };
}

但是,要使其工作,您需要使用 Object.createe 直接从父原型继承,而不是从父类的实例继承:

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

虽然 IE8 不支持 Object.create,但您可能需要为它找到一个 shim。

http://kangax.github.io/es5-compat-table/#Object.create


也就是说,我可能会说我的建议可能不是解决问题的最佳方法。

第一种选择是将那些隐藏的方法公开。您确定要费力隐藏它们吗?

第二种选择是对私有方法简单地使用静态函数:

function makeB(obj){
    obj.callB();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多