私はPythonとSmalltalkのバックグラウンドからJavascriptに来ています。 ECMAScript5では、新しいオペレータなしでプロトタイプオブジェクト指向に手を入れたかったのです。 。Object.createと名前付きコンストラクタを持つプロトタイプOO
制約:
- オプションのnew演算子Objective-CとPython
ここで私はt彼の基準:
function subclass(Class, Base) {
"use strict";
function create(self, args) {
if (!(self instanceof this))
self = Object.create(this.prototype);
var init = self.__init__;
return init ? init.apply(self, args) : self;
}
if (Base instanceof Function) Base = Base.prototype;
else if (Base===undefined) Base = Object.prototype;
Class.prototype = Object.create(Base);
Class.prototype.constructor = Class;
Class.create = create;
Class.define = function define(name, fn) { return Class.prototype[name] = fn; };
Class.define('__name__', Class.name);
return Class;
}
そして、簡単なモックアップで動作するようです:ファクトリ関数としてのクラスを使用して
function Family(){return Family.create(this, arguments)}
subclass(Family, Object);
Family.define('__init__', function __init__(n){this.name=n; return this;});
function Tribe(){return Tribe.create(this, arguments)}
subclass(Tribe, Family);
function Genus(){return Genus.create(this, arguments)}
subclass(Genus, Tribe);
function Species(){return Species.create(this, arguments)}
subclass(Species, Genus);
:
var dog = Species('dog');
console.assert(dog instanceof Object);
console.assert(dog instanceof Family);
console.assert(dog instanceof Tribe);
console.assert(dog instanceof Genus);
console.assert(dog instanceof Species);
またはnew演算子を使用して:
var cat = new Species('cat');
console.assert(cat instanceof Object);
console.assert(cat instanceof Family);
console.assert(cat instanceof Tribe);
console.assert(cat instanceof Genus);
console.assert(cat instanceof Species);
console.assert(Object.getPrototypeOf(dog) === Object.getPrototypeOf(cat))
私は必要が見落とされましたか私の実装でプロトタイプオブジェクト指向の機能? Javascriptの規約や対話を変更する必要がありますか?要約すると、ここに「つまらない」とは何か、明らかな改善がなされていますか?
私はコンストラクタ定義でDRYerになりたがっていましたが、関数の名前プロパティは書き込み可能ではなく、WebKit Inspectorのオブジェクト名をサポートしています。私は欲しいものを達成するための評価を作ることができましたが、... yuck。
うわー、私はジャバスクリプトをこの方法を使用して見たことがない...あなたは「信頼できない」件のデータを処理するとき場合 –
evalのは危険ですが、私はあなたが[この操作を行う際に1が実際に、evalを使うべきではない理由を参照していけませんあなたはjsに連想配列がないので、ある種の評価を使用しています。 – mpm
@camusはい、私は '/ \ w + /'正規表現を使って有効なメソッド名だけであることを確認しました。しかし、それはタックをインストールするためにスレッジハンマーを使用するようです - それは関数の名前プロパティを設定することが許可されていれば、はるかにエレガントになります。結局、Javascriptはプロトタイプ言語です。 –