Затем мне нужно определить функцию isInstance, которая будет вести себя как Java instanceOf или PHP instanceof.
Что не так с собственным JavaScript instanceof
?
Учитывая вашу наследуемую функцию,
function Shape() {};
function Square() {};
Square.inherit(Shape);
alert(new Square() instanceof Shape); // true
instanceof
работает, проверяя, находится ли свойство prototype
данного конструктора в цепочке прототипов экземпляра. Так, например.
function A() {};
function B() {};
var b= new B();
A.prototype= B.prototype;
alert(b instanceof A); // true
Вот почему instanceof Shape
работает, хотя Square.prototype
не был создан с использованием new Shape
; вместо этого он был создан new proto()
, но так как proto
и Shape
имеют одно и то же свойство prototype
, JavaScript не может определить разницу.
Обычно вы не видите цепочку прототипов (хотя Firefox и WebKit делают ее доступной через свойство __proto__
), но это способ, которым наследование фактически обрабатывается в JS; Свойство visible Function.prototype используется только для установки начального состояния цепочки прототипов в new
-time.
Как добавить isInstance к экземплярам, а не только к функциям?
Object.prototype.isInstance(c)= function() {
return this instanceof c;
}
Я не уверен, что это действительно сильно тебя порадует! А создание прототипа в Object часто считается дурным тоном, поскольку оно затрагивает буквально каждый объект и может запутать другие сценарии, использующие Object для поиска.
Есть ли какие-либо улучшения в моем коде (может быть, метод наследования)?
Мне нравится ваш метод унаследованного, это один из более легких и JavaScripty способов создания объектной системы.
С instanceof
вы можете потерять свойства parent
и constructor
, если вы не хотели их использовать в других удобных целях. Я бы поставил parent
на функцию конструктора (так что это похоже на подкласс, зная его базовый класс), и я бы назвал constructor
чем-то другим (уже есть свойство с именем constructor
в Firefox, но оно не ' делать то, что вы думаете, и, как правило, лучше избегать).
Единственный недостаток, который я вижу, это то, что вы не можете наследовать функцию конструктора, поэтому каждый раз, когда вы создаете новый подкласс, вы должны написать конструктор, который вызывает базовый конструктор, даже если конструктор вашего подкласса вообще ничего не делает:
function Square() {
Shape.apply(this, arguments);
}
Square.inherit(Shape);