原因是,尽管我们可以在Javascript中使用伪经典继承,但实际上我们必须实现自己的extend
或inherit
。
原型继承怎么样 - 我认为它确实具有如果使用foo.bar
,如果bar
不是foo
的属性,解释器或编译代码的功能(例如,如果使用谷歌V8)将上升原型链,但没有内置方法使对象b
的隐藏原型属性指向a
作为原型链。我们必须通过定义clone()
函数或Object.create()
来添加它。更重要的是,我认为我在纯原型继承代码中看到没有任何构造函数。所以看起来在原型代码中,没有构造函数(构造函数)。但是如果我们使用原型继承,我们实际上必须使用构造函数来实现clone()
- 这更像是伪古典继承方。
所以看起来原来的Javascript实际上既不是伪经典也不是Prototypal继承?根据{{3}},我读到它需要在10天内上市,否则会出现更糟糕的情况。但我也有些疑惑,为什么在1995年Javascript出现后1年或2年,至少Navascript版本的Javascript还没有添加extend
和Object.create()
方法?
这个问题旨在理解和阐明Javascript的伪古典和原型部分中的一些概念。它是真的 - 原始的Javascript本身不具有伪古典或原型继承支持吗?
答案 0 :(得分:2)
最初的目标是使用类似C语言的语言,让JS看起来足够熟悉,以加快采用。
1997年,没有人以足够先进的方式使用JS,甚至无法考虑查看原型。
人们仍在制作像:
这样的物品var car = new Object();
car.doors = 4;
car.wheels = 4;
car.position = new Object();
car.position.x = 230;
car.position.y = 400;
使用数组制作这些对象的人更好。
var car = new Array();
car["doors"] = 4;
car["wheels"] = 4;
car["position"] = new Array();
car["position"]["x"] = 230;
car["position"]["y"] = 400;
这就是当时JS的 LOT 的样子。
说实话,仍然有很多看起来像这样,因为人们仍然从Java或C#或C ++或PERL或PHP进来,并认为它看起来如此熟悉,他们不需要学习它 - 他们可以将数组放入对象,集合或字典中,这没关系......
这就是他们所做的。
没有人认为JS会成为一个大问题。没有人想到这一点。所以浏览器间的标准直到它已经成为一件大事之后才会出现,而且在那时,每个人对JS 的内容有不同的看法。
即便如此,Internet Explorer拥有最广泛的市场份额,以及最破碎和非标准的JS实施...... 这已经发生了变化,但是说真的,我们现在只是点了点,所有新版本的浏览器(大5)都支持五年前概述和标准化的功能......
......当你谈论这样的事情时,这需要多长时间才能转动船只。
答案 1 :(得分:1)
答案 2 :(得分:1)
经典继承不是官方的语言特征,但原型继承是(并且已经很长时间了)但它有点笨拙。
但事实证明,你可以用原型复制经典继承,但不是相反。并且有很多库就可以了。我喜欢John Resig的here或backbone或coffee script classes。
你有构造函数,但没有超级。
Here's an example of how to do simple inheritance in plain old javascript.
// Parent "class"
var Foo = function() {
this.barVal = 'baz';
};
// Parent instance method
Foo.prototype.bar = function() {
return this.barVal;
};
// Test out an instance
var foo = new Foo();
console.log(foo.bar()); // 'baz'
// Child "class"
var Foo2 = function() {
Foo.call(this); // invokes previous constructor
};
// Assign prototypical ancestor
Foo2.prototype = new Foo();
// Child instance method
Foo2.prototype.bar = function() {
var prevResult = Foo.prototype.bar.call(this); // invoke previous method implementation
return prevResult + '!';
}
// New child instance method
Foo2.prototype.newMethod = function() { // new method only on child class
return 'Some new method!'
};
// Test out an instance
var foo2 = new Foo2()
console.log(foo2.bar()) // 'baz!'
console.log(foo2.newMethod()) // 'Some new method!'
但这里也存在边缘情况。使用一个小助手库来简化这一点并不遗憾。