2

その理由は、Javascript では疑似古典的継承を使用できますが、実際には独自のextendorを実装する必要があるためinheritです。

foo.barプロトタイプの継承についてはどうですか -が使用されている場合bar、 が のプロパティではない場合foo、インタープリターまたはコンパイルされたコード (Google V8 を使用している場合など) はプロトタイプ チェーンを上っていくという機能があると思いますが、 objectbの非表示のプロトタイプ プロパティをaプロトタイプ チェーンとして指すようにする組み込みメソッドはありません。clone()関数 orを定義して追加する必要がありObject.create()ます。さらに、純粋なプロトタイプの継承コードには、コンストラクターがまったくないことがわかります。したがって、プロトタイプ コードでは、コンストラクター (コンストラクター関数) が存在しないように見えます。しかし、プロトタイプの継承を使用する場合、実際にはclone()コンストラクターを使用して実装する必要があります。これは、疑似古典的な継承の側面に似ています。

では、元の Javascript は実際には疑似古典的継承でもプロトタイプ継承でもないように思われますか? このウィキペディアの記事によると、10 日以内に市場に出る必要があると読みました。しかし、1995 年に Javascript が登場してから 1 年か 2 年後に、少なくとも Javascript の Netscape バージョンにはまだ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) は、5 年前に概説および標準化された機能をサポートしています...

…こんなことを言っていると、ボートが向きを変えるのにかかる時間です。

于 2012-10-02T18:11:12.370 に答える
1

はい http://kangax.github.com/es5-compat-table/

于 2012-10-02T17:35:47.723 に答える
1

古典的継承は公式の言語機能ではありませんが、原型継承(そして長い間使用されてきました) ですが、少し扱いに​​くいです。

しかし、プロトタイプを使用して古典的な継承を複製することはできますが、その逆はできないことがわかりました。そして、そのためのライブラリがたくさんあります。John Resig のhereまたはbackboneまたはcoffee スクリプト クラスが好きです。

コンストラクターはありますが、スーパーはありません。

プレーンな古い 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 に答える