将非继承函数添加到继承的类-Javascript

将非继承函数添加到继承的类-Javascript,javascript,jquery,inheritance,Javascript,Jquery,Inheritance,我不熟悉Javascript中的面向对象编程。昨天我阅读了javascript中的prototype和prototype.constructor以及它们在javascript继承中的作用 我制作了一个javascript函数,继承自一个父函数。但是我希望这个子函数的一些方法不会被它的子函数继承 就是 函数A//parent | |`马蹄莲() `makeA() 这是主父类 函数B//A的子函数 | |`callB()//可以被继承 |`makeB()//不能被继承 |`callA()//继承的

我不熟悉Javascript中的面向对象编程。昨天我阅读了javascript中的
prototype
prototype.constructor
以及它们在javascript继承中的作用

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

就是

函数A//parent
|
|`马蹄莲()
`makeA()
这是主父类

函数B//A的子函数
|
|`callB()//可以被继承
|`makeB()//不能被继承
|`callA()//继承的
`makeA()//继承
B
是我想写的子函数

函数C//B的子函数
|
|`callC();
|`makeC();
|`callB();
|`胼胝体();
`makeA();
我是这样写的:

函数A(){}
A.prototype.callA=函数()
{
警报(“CallA”);
}
A.prototype.makeA=函数()
{
警报(“makeA”);
}
函数B(){
函数makeB(){//这不起作用我无法使用B的对象调用makeB
警报(“makeB”);
}   
}
B.原型=新的A();
B.prototype.constructor=B;
B.prototype.callB=函数()
{
警报(callB);
}
函数C(){}
C.prototype=新的C();
C.prototype.constructor=C;
C.prototype.callC=函数()
{
警报(“callC”);
}
C.prototype.makeC=函数()
{
警报(“makeC”);
}
$(文档).ready(函数(){
var b=新的b();
var c=新的c();
$(文档)。单击(函数(){
c、 callB();
c、 callC();
b、 callB();
b、 makeB();//未被调用
});
});

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

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

function B(){
   this.makeB = function(){
     //..
   };
}
但是,要使其工作,您需要使用Object.createe直接从父原型继承,而不是从父类的实例继承:

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;
IE8不支持Object.create,因此您可能需要为其找到一个垫片


也就是说,我冒着风险说,我的建议可能不是解决问题的最佳方式

第一种选择是公开这些隐藏的方法。你确定你想把它们藏起来吗

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

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

为什么要从
C
隐藏
makeB
?像这样破坏Liskov替换原则是一种代码气味。@missingno:您可能需要它。。我不确定Liskov替换是否正确。但在java中,我一直在这样做。您可能需要一些不想与子类共享的函数。是吗?@没有LSP被高估了。打倒严格的子类型关系和当前的OOP“规范”@Veer“展平”关系树怎么样?每个类型都可以有不同的原型,独立于其他类型(即,没有一个是“子类型”)-只需手动将每个类型应该具有的方法连接到适当的“元”函数存储(或者实际上是定义它们的第一个原型)。@Veer也就是说,代码看起来与上面相同,但是
B.prototype.makeB=function..
在删除原型链接之后?那么它就不会从其他原型中“继承”。