Как объект ссылается на себя в Javascript? - PullRequest
0 голосов
/ 25 сентября 2010

Я экспериментировал с наследованием в javascript и написал эти две функции:

Object.prototype.inherits=function(obj){this.prototype=new obj;}
Object.prototype.pass=function(obj){obj.prototype=new this;}

Этот код работает очень хорошо:

Dog.inherits(Animal);

Но следующее терпит неудачу:

Animal.pass(Dog);

Насколько я понимаю, мои функции прохода не работают, потому что "this" не является ссылкой на сам экземпляр объекта? Если это так, как я могу ссылаться на объект внутри себя?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 25 сентября 2010

Работает для меня, с тестовым кодом вроде:

function Animal() {}
Animal.prototype.isanimal= 1;
function Dog() {}
Animal.pass(Dog);
Dog.prototype.isdog= 2;
alert(new Dog().isanimal); // 1
alert(new Dog().isdog);    // 2

Однако имейте в виду, что new this или new obj вызовет функцию this/obj, создав новый полный экземпляр.Если у вас есть код конструктора в этой функции, который ожидает получить некоторые аргументы или устанавливает состояние экземпляра, вы можете столкнуться с проблемами.Чтобы создать новый this без вызова this как функции, вы можете использовать другой конструктор, который ничего не делает:

function nonconstructor() {}
nonconstructor.prototype= this.prototype;
obj.prototype= new nonconstructor();

Кроме того, вы должны избегать прототипирования на Object.Это создаст проблемы для кода, использующего Object в качестве поисковой карты общего назначения.Поскольку вы, похоже, работаете только с функциями-конструкторами, прототипирование на Function должно отвечать вашим потребностям и намного безопаснее.

1 голос
/ 25 сентября 2010

Ну, на самом деле, они делают одно и то же:

Dog.prototype = new Animal;

Значение this внутри методов будет ссылаться на базовый объект , где была вызвана ссылка, вслучай:

Dog.inherits(Animal);

Значение this будет ссылаться на функцию конструктора Dog, а аргумент obj будет функцией Animal.

Когда выcall:

Animal.pass(Dog);

Значение this будет относиться к функции Animal, делая в конце то же самое, что и метод inherits, но наоборот.

Я бы порекомендовал вам , а не расширить объект Object.prototype, потому что это может вызвать много проблем, например, эти два свойства будут перечислены в любом цикле for-in, например:

for (var prop in {}) { // <-- an empty object!
  alert(prop); // will alert 'inherits' and 'pass'
}

Все объекты наследуются от Object.prototype, и кажется, что вы собираетесь использовать эти методы только для объектов Function, было бы безопаснее расширять объект Function.prototype или реализовывать методы как функции, которые принимаютдва параметра.

...