注意:
正如答案所说,由于问题和我的评论中描述的一些问题,问题中提出的代码并没有真正实现继承(否则它会成为答案而不是问题......).它可以像预期的那样继承假(甚至不是原型).
摘要
简而言之,使它类似于我们编写一般的OO语言而不是javascript,但保持继承是正确的.
故事
的Object.create是实现原型继承的好方法,但它是一个有点混乱,以一个类型的大脑和新的球迷.
我们可以通过各种方式编写javascript代码,就像我们使用伪经典模式编写其他OO语言一样.因为它是伪经典的,我们必须正确处理javascript的底层原型继承.
我想要找到的是一种可以在类声明上实现伪古典继承的方法.演示代码放在帖子的后面,它按预期工作,但是,有一些烦人的事情:
我无法摆脱return类声明或继承不起作用.
除了传入this类声明以使返回的闭包知道是什么,我没办法this.
我也想摆脱function (instance, _super) {,但还没有一个好主意.
不继承类的静态(自己的属性).
解决方案比现有框架更多的是一些语法糖,一个好的模式是适用的.
该_extends函数:
function _extends(baseType) {
return function (definition) {
var caller=arguments.callee.caller;
var instance=this;
if(!(instance instanceof baseType)) {
(caller.prototype=new baseType()).constructor=caller;
instance=new caller();
}
var _super=function () {
baseType.apply(instance, arguments);
};
definition(instance, _super);
return instance;
};
}
Run Code Online (Sandbox Code Playgroud)
本Abc类:
function Abc(key, …Run Code Online (Sandbox Code Playgroud) 来自 GoF 的书:
原型对于像 C++ 这样的静态语言特别有用,其中类不是对象,并且在运行时很少或没有类型信息可用。在像 Smalltalk 或 Objective C 这样的语言中,它提供相当于原型(即类对象)以创建每个类的实例的内容并不重要。这种模式内置于基于原型的语言中,如 Self [US87],其中所有对象的创建都是通过克隆原型进行的。
“类不是对象”是什么意思?
不总是这样吗?
一个类是一个对象是什么意思?
我注意到每个关于如何进行JavaScript继承的教程都是这样做的:
SubClass.prototype = new SuperClass();
Run Code Online (Sandbox Code Playgroud)
但是这将创建超类的单个实例并在子类的所有实例之间共享它.
问题是我想将参数传递给超类构造函数,该构造函数源自传递给子类的参数.
在Java中,这将是这样做的:
class SubClass extends SuperClass {
public SubClass(String s) {
super(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试过这样的事情:
function SubClass(args) {
this.constructor.prototype = new SuperClass(args);
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.那么在JavaScript中有没有办法做到这一点?
我试图理解JavaScript的OOP模型,所以我正在阅读这篇文章:https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
以下代码很有趣:
function Person(gender) {
this.gender = gender;
alert('Person instantiated');
}
Person.prototype.gender = '';
var person1 = new Person('Male');
var person2 = new Person('Female');
//display the person1 gender
alert('person1 is a ' + person1.gender); // person1 is a Male
Run Code Online (Sandbox Code Playgroud)
有趣而且不清楚的是这一行:
Person.prototype.gender = '';
Run Code Online (Sandbox Code Playgroud)
我不明白所以我用该行测试了代码,没有它.
代码在两种情况下都能正常工作.
所以我的问题是:
为什么作者添加该行?
阅读可以使用哪些技术在JavaScript中定义一个类,以及它们的权衡取舍是什么?在stackoverflow上我明白我可以通过定义一个类
方法1:
function Person(name, gender){
this.name = name;
this.gender = gender;
}
Run Code Online (Sandbox Code Playgroud)
并在原型中添加函数,以避免每次实例化时重新创建成员函数.喜欢
Person.prototype.speak = function(){
alert("my name is" + this.name);
}
Run Code Online (Sandbox Code Playgroud)
并通过创建其实例
var person = new Person("Bob", "M");
Run Code Online (Sandbox Code Playgroud)
我认为使用新的关键字就可以创建相同的对象
方法2:
var Person = function (name, gender) {
return {name:name, gender:gender};
}
person = Person("Bob", "M");
Run Code Online (Sandbox Code Playgroud)
第二种方法是否完成了第一种方法完成相同的操作?如果是这样的话,我将如何在第二种方法中通过原型模拟添加函数(正如我们在方法1中所说的那样)?