【发布时间】:2015-04-30 16:12:34
【问题描述】:
我有这个:
function Book (){
this.width = 7;
this.height = 10;
var pages = 100;
this.tear_page = function(){
return --pages;
}
}
function TechBook () {
var pages = 50;
this.open_book = function(){ return "Opened in page "+(pages/2); };
return this;
}
var bBook = Object.create(new Book(), new TechBook());
console.log(bBook);
console.log(bBook.tear_page());
console.log(bBook.open_book());
我无法让它工作。我尽可能让 TechBook 从 Book 继承对本地/私有变量的访问,但只能从 Book 函数继承。如果我添加新方法或覆盖它们,它们将无法再获取这些变量。我想知道是否有办法仍然可以从子类的方法中访问这些变量并在子类中创建新的私有变量。
如果这是不可能的,那意味着如果你想要继承,你就不能拥有私有变量,反之亦然。哦,顺便说一句,我知道 chrome 现在(感谢 ES6)可以自然地实现类: class TechBook extends Book (){} 和许多其他语言一样,但目前支持仅限于 chrome 的最新版本......不知道有没有其他方法可以解决这个问题。
【问题讨论】:
-
您试图将经典概念应用到 JavaScript 中,但它们在这里并不适用。 JavaScript 中没有“public”或“private”之类的东西,只有 closure
-
虽然可以使用闭包来模拟 privacy,但据我所知,没有办法拥有 protected 成员。这真的是你想要的。私有成员永远不会被继承,这在 Java/C# 或任何其他 oo 语言中都不起作用。最后一件事,ES6 类也没有受保护的成员。
-
你的
bBook = Object.create(new Book(), new TechBook())代码完全搞砸了。请参阅here 以正确进行继承(然后使用bBook = new TechBook();进行实例化)。 -
@Vandervals:但是,您已经覆盖了访问私有变量的公共方法……
-
具有继承的语言永远不会授予您访问私有变量的权限。私有意味着......在它们所在的上下文中是私有的,并且没有人可以在该上下文之外访问它。
标签: javascript oop inheritance