JavaScript: Object.myMethod против Object.protoype.myMethod?

У меня проблема, когда я хочу добавить метод в класс Object в JavaScript. Я не знаю разницы между Object.myMethod и Object.prototype.myMethod.

Object.myMethod = function (){};

Object.prototype.myMethod = function (){};

Может кто-нибудь мне помочь


person hoatv    schedule 19.10.2011    source источник
comment
Просто google Объяснение наследования прототипа Javascript, а затем возвращайтесь с вопросами.   -  person RobG    schedule 19.10.2011
comment
Возможный дубликат Javascript: наследование прототипа   -  person RobG    schedule 19.10.2011
comment
возможный дубликат JavaScript: Class.method vs. Class.prototype.method   -  person Rob W    schedule 27.12.2011


Ответы (2)


Object - функция-конструктор. Как и все функции в JavaScript, это объект, и вы можете прикреплять к нему свойства. Эти свойства могут быть функциями. Так поступаем

Object.myMethod = function () { };

присоединяет myMethod к функции конструктора Object, что означает, что вы можете вызвать его так:

Object.myMethod();

Object.prototype - прототип, используемый в качестве основы для всех объектов JavaScript. Это сам по себе объект, и поэтому вы снова можете прикреплять к нему свойства. Разница в том, что свойства, прикрепленные к прототипу, наследуются прототипом всеми объектами через их внутреннюю [[Prototype]] ссылку, поэтому возможно что-то вроде этого:

Object.prototype.myMethod = function () { };

var obj = {};
obj.myMethod();

var otherObj = { something: "else" };
otherObj.myMethod();

var objectViaConstructor = new Object();
objectViaConstructor.myMethod();

var instanceOfSomethingThatInheritsFromObject = new XMLHttpRequest();
instanceOfSomethingThatInheritsFromObject.myMethod();

Обратите внимание, что большая часть вышеизложенного применяется к произвольным функциям-конструкторам, за исключением того, что вы не получаете особый синтаксис литерала объекта, а Object является особенным в том смысле, что все (вплоть до примера XMLHttpRequest) наследуется от него. Так:

function MyConstructor() { }
MyConstructor.staticMethod = function () { };
MyConstructor.prototype.method = function () { };

MyConstructor.staticMethod();

var myConstructed = new MyConstructor();
myConstructed.method();
person Domenic    schedule 19.10.2011

Object.myMethod - это метод одного объекта, он похож на статический метод в языках с классическим ООП.

Object.prototype.myMethod - это метод, который будет существовать во всех экземплярах объекта, аналогичный методу экземпляра (иногда называемому просто методом, а не статическим методом) в языках с классическим ООП.

Если вы создаете экземпляры своего объекта (т.е. new MyClass()), используйте метод прототипа.

person Stephen    schedule 19.10.2011