繁体   English   中英

在ECMA-262或ECMA 5.1之前的Javascript是否不具有伪古典继承或原型继承支持,这是真的吗?

[英]Is it true that Javascript, before ECMA-262 or ECMA 5.1, doesn't have pseudo-classical inheritance or prototypal inheritance support?

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

原型继承如何-我认为它具有以下功能:如果使用foo.bar ,如果bar不是foo的属性,则解释器或编译后的代码(例如,如果使用Google V8)将在原型上链,但是没有内置方法可以使对象b的隐藏原型属性指向a作为原型链。 我们必须通过定义clone()函数或Object.create()来添加它。 而且,我想我在纯原型继承代码中看到,根本没有构造函数。 因此,看起来像在原型代码中,没有构造函数(构造函数)。 但是,如果我们使用原型继承,则实际上必须使用构造函数来实现clone() ,这更像伪经典继承方。

因此看来原始Javascript实际上既不是伪古典继承也不是原型继承? 我读到它需要在10天之内投放市场,否则根据Wikipedia的文章 ,可能会出现更糟糕的情况。 但是我也有些奇怪,为什么在Javascript在1995年问世后的1年或2年,至少Netscape版本的Javascript没有添加extendObject.create()方法?

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

最初的目标是模仿类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大)支持功能已在十年前概述并标准化...

...当您谈论这样的事情时,这是多长时间将一条船转过来。

古典继承不是一种正式的语言功能,但是原型继承 (并且已经存在很长时间了),但是有点笨拙。

但是事实证明,您可以使用原型来复制经典继承,但不能相反。 为此,有很多库。 我喜欢John Resig的这里骨干 课程咖啡脚本课程

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

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

但是这里也有一些极端情况。 使用一个小的帮助程序库来简化此过程并不令人感到羞耻。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM