我從Python和Smalltalk的背景來到JavaScript,我很欣賞Self和Lisp在語言中的線性。使用ECMAScript5,我想在沒有新操作員的情況下嘗試原型OO。原型OO與Object.create和命名構造函數
約束:
- 可選new運算符創建類
- 原型鏈必須調試支持
- 的alloc()的init()創建樣序列是正確的的instanceof
- 命名的構造函數WebInspector。 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))
我忽視了需要在我的實施中原型OO的功能?是否有Javascript慣例或互動我應該做出改變?總之,這裏的「陷阱」是什麼,並且有什麼明顯的改進呢?
我想用構造函數定義DRYer,但是我發現函數的name屬性是不可寫的,那就是支持WebKit Inspector的對象名稱的東西。我能夠構建一個評估來完成我想要的,但是......惡作劇。
哇,我從來沒有使用JavaScript這樣嗎... – 2012-02-29 00:53:18
EVAL是危險的,如果當你處理「不可信」 DATAS,但我不明白爲什麼一個當你這樣做[不應該使用eval,其實astring]你正在使用某種類型的eval,因爲js中沒有關聯數組。 – mpm 2012-03-02 00:11:51
@camus是的,我甚至使用了'/ \ w + /'正則表達式來確保它只是一個有效的方法名稱。但它似乎使用大錘來安裝大頭針 - 如果允許設置函數的名稱屬性,它會更優雅。 Javascript是一種原型語言,畢竟... – 2012-03-02 00:38:01