[英]Why is `Type` of calling function not `reference` in `JavaScript(ECMA-262 5.1)`?
[英]Is it true that Javascript, before ECMA-262 or ECMA 5.1, doesn't have pseudo-classical inheritance or prototypal inheritance support?
原因是,尽管我们可以在Javascript中使用伪经典继承,但实际上我们必须实现自己的extend
或inherit
。
原型继承如何-我认为它具有以下功能:如果使用foo.bar
,如果bar
不是foo
的属性,则解释器或编译后的代码(例如,如果使用Google V8)将在原型上链,但是没有内置方法可以使对象b
的隐藏原型属性指向a
作为原型链。 我们必须通过定义clone()
函数或Object.create()
来添加它。 而且,我想我在纯原型继承代码中看到,根本没有构造函数。 因此,看起来像在原型代码中,没有构造函数(构造函数)。 但是,如果我们使用原型继承,则实际上必须使用构造函数来实现clone()
,这更像伪经典继承方。
因此看来原始Javascript实际上既不是伪古典继承也不是原型继承? 我读到它需要在10天之内投放市场,否则根据Wikipedia的文章 ,可能会出现更糟糕的情况。 但是我也有些奇怪,为什么在Javascript在1995年问世后的1年或2年,至少Netscape版本的Javascript没有添加extend
和Object.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.