Разница между javascript.prototype.abc и javascript.prototype - PullRequest
2 голосов
/ 07 марта 2012

Мне интересно про прототип javascript. Я знаю, что прототипирование позволяет пользователю добавлять новые свойства и методы в конструктор или объект.

Я использовал следующее несколько раз:

function Example() {}
Example.prototype.add = function () {};
Example.prototype.sub = someVar;

Таким образом, я могу использовать Example.add как функцию и Example.sub как элемент объекта. Но случается, когда кто-то пишет что-то вроде этого

Example.prototype = function() {
                    //Code
                    };

Любая помощь?

Ответы [ 5 ]

3 голосов
/ 07 марта 2012

Прототип - это место, где javascript ищет методы / переменные.

При использовании нового прототипа конструктора также предоставляется созданный объект.

Как следствие, прототипдолжен быть OBJECT (и вы можете изменить его содержимое).

Основное использование прототипа - иметь:

var myExample = new Example();
myExample.add() => call the add function of the prototype with this = myExample.

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

1 голос
/ 07 марта 2012

Давайте рассмотрим простой пример:

 var Person = function(args){
     this.init(args);
 }

При определении нескольких методов для прототипа человека мы сделаем следующее:

 Person.prototype = {
     getAge : function(){},
     nickname : "R2D2"
 };

Или

 Person.prototype.getAge = function() {...};
 Person.prototype.nickName= "R2D2";

Оба делают одно и то же.Я предпочитаю первую версию, потому что она легче для чтения и требует меньше символов для написания (уменьшая площадь моего кода).

Единственная причина, по которой я могу подумать об использовании

 Person.prototype = function(){}

это создать частную область, доступную только для прототипа Person.Но для этого требуется функция, выполняющая себя, которая возвращает объект.

 Person.prototype = (function(){
    var theAnswerToEverything = 42;
    return {
        getTheAnswerToEverything : function(){
           return theAnswerToEverything;
        }
    };
 })();

переменная theAnswerToEverything будет использоваться только методами прототипа Persons.Более сложные примеры могут быть созданы с использованием того же принципа.

1 голос
/ 07 марта 2012

Пример. Прототип должен ссылаться на ОБЪЕКТ, а не на функцию. В вашем первом примере:

Example.prototype.add = function () {}; 
Example.prototype.sub = someVar; 

Вы правильно добавляете свойства в прототип (помните, объект). Таким образом, 2 добавленных вами свойства будут автоматически появляться на объектах, созданных new Example ().

Example.prototype = function() {};  

Вы заменили прототип другим объектом, а именно таким случаем является объект (помните, что функция Javascript все еще является объектом). Именно свойства этой функции наследуются объектом, созданным выражением new Example ().

0 голосов
/ 07 марта 2012

Вы просто переопределяете прототип с помощью объекта функции.Он не будет вызываться при поиске атрибутов на объектах, созданных с использованием new Example, но он будет работать как любой другой объект-прототип, и вы можете присвоить ему атрибуты, такие как

Example.prototype.foo = 8;
console.log(new Example().foo); // 8
0 голосов
/ 07 марта 2012

В JavaScript функции также являются объектами.

Итак, в вашем случае, prototype становится членом объекта Example.

если у вас было

Example.prototype = function() { alert('hi'); };

затем звонит

Example.prototype() 

предупредит "привет"

...