2

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

原型继承呢——我认为它确实有这样的特性,如果foo.bar使用了,如果bar不是 的属性foo,解释器或编译代码(例如如果使用 Google V8)将沿着原型链上升,但是有没有内置方法可以使 objectb的隐藏原型属性指向a原型链。我们必须通过定义一个clone()函数或Object.create(). 更重要的是,我想我在纯原型继承代码中看到没有任何构造函数。所以看起来在原型代码中,没有构造函数(构造函数)。但是如果我们使用原型继承,我们实际上必须clone()使用构造函数来实现——这更像是伪经典继承方面。

所以看起来原来的 Javascript 实际上既不是伪经典也不是原型继承?根据维基百科的这篇文章,我读到它需要在 10 天内上市,否则市场上会出现更糟糕的情况。但我也有些纳闷,为什么在 1995 年 Javascript 出现后的 1 年或 2 年,至少 Netscape 版本的 Javascript 还没有添加extendandObject.create()方法?

这个问题旨在理解和澄清 Javascript 的伪经典和原型部分中的一些概念。这是真的吗——原始的 Javascript 本身并没有伪经典或原型继承支持?

4

3 回答 3

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 的样子。

老实说,仍然有很多看起来是这样的,因为人们仍然从 Java 或 C# 或 C++ 或 PERL 或 PHP 进来,并认为它看起来如此熟悉以至于他们不需要费心去学习它- 他们可以把数组变成对象,或者变成集合,或者变成字典,这没关系......

这就是他们所做的。

没有人认为 JS 会成为一件大事。从来没有人想到过。所以浏览器间的标准直到它已经成为一件大事时才出现,并且在那个时候,每个人对 JS什么都有不同的想法。

即便如此,Internet Explorer 拥有最广泛的市场份额,以及最糟糕和最不标准的 JS 实现......这已经改变了,但说真的,我们现在刚刚达到一个点,所有新版本的浏览器都很重要(大 5)支持五年前概述和标准化的功能......

......当你谈论这样的事情时,这就是转身所需的时间。

于 2012-10-02T18:11:12.370 回答
1

的 http://kangax.github.com/es5-compat-table/

于 2012-10-02T17:35:47.723 回答
1

经典继承不是官方语言功能,但原型继承(并且已经存在很长时间)但它有点笨拙。

但事实证明,您可以使用原型复制经典继承,但反之则不行。并且有很多图书馆可以做到这一点。我喜欢John Resig 的herebackbonecoffee script classes

您确实有构造函数,但没有超级构造函数。

这是一个如何在普通的旧 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!'​

但这里也有边缘情况。使用一个小的帮助程序库来使这更容易一点也不丢人。

于 2012-10-02T17:37:20.810 回答