在ECMA-262或ECMA 5.1之前,Javascript是否具有伪经典继承或原型继承支持?

时间:2012-10-02 17:26:49

标签: javascript

原因是,尽管我们可以在Javascript中使用伪经典继承,但实际上我们必须实现自己的extendinherit

原型继承怎么样 - 我认为它确实具有如果使用foo.bar,如果bar不是foo的属性,解释器或编译代码的功能(例如,如果使用谷歌V8)将上升原型链,但没有内置方法使对象b的隐藏原型属性指向a作为原型链。我们必须通过定义clone()函数或Object.create()来添加它。更重要的是,我认为我在纯原型继承代码中看到没有任何构造函数。所以看起来在原型代码中,没有构造函数(构造函数)。但是如果我们使用原型继承,我们实际上必须使用构造函数来实现clone() - 这更像是伪古典继承方。

所以看起来原来的Javascript实际上既不是伪经典也不是Prototypal继承?根据{{​​3}},我读到它需要在10天内上市,否则会出现更糟糕的情况。但我也有些疑惑,为什么在1995年Javascript出现后1年或2年,至少Navascript版本的Javascript还没有添加extendObject.create()方法?

这个问题旨在理解和阐明Javascript的伪古典和原型部分中的一些概念。它是真的 - 原始的Javascript本身不具有伪古典或原型继承支持吗?

3 个答案:

答案 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的herebackbonecoffee 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!'​

但这里也存在边缘情况。使用一个小助手库来简化这一点并不遗憾。