2013-10-13 4 views
-3

Есть ли смысл использовать функцию Prototype для объекта в JavaScript, если у вас нет интереса к использованию наследования для этого объекта?Функция прототипа JavaScript

Иными словами, имеет ли функция прототипа какие-либо цели, кроме как добиться механизма наследования?

+8

Есть ли причины использовать JavaScript, если у вас нет интереса к использованию JavaScript? – meagar

+1

Я предполагаю, что здесь есть опечатка, учитывая ваш второй вопрос. – TheSeamau5

+0

Вы имели в виду «наследование» вместо «JavaScript»? – Ryan

ответ

2

... имеет ли функция прототипа какие-либо цели, кроме как добиться механизма наследования?

Я предполагаю, что вы имеете в виду собственность prototype объектов Function. (В JavaScript нет функции «Прототип»).

Это зависит от того, что вы подразумеваете под «наследованием». Цель prototype собственности на Function случаях это указать объект, который будет назначен в качестве прототипа объектов, созданных с помощью этой функции в качестве конструктора, например:

var f = new Foo(); // Assigns `Foo.prototype` as `f`'s prototype 

Таким образом, f имеет доступ к свойствам, определенным этим прототипом. Если это то, что вы подразумеваете под наследованием, то да, это единственная цель для свойства prototype для функций.

Обратите внимание, что теперь у нас есть ECMAScript5, вы можете назначить прототипы без использования функции конструктора, если вы предпочитаете, используя новый Object.create:

var f = Object.create(somePrototype); // Assigns `somePrototype` as `f`'s prototype 

Вот более конкретный пример и тех:

с помощью функции конструктора:

function Foo(name) { 
    this.name = name; 
} 
Foo.prototype.hey = function() { 
    console.log("Hi, I'm " + this.name); 
}; 
var f = new Foo("Fred"); // Assigns `Foo.prototype` as `f`'s prototype 
f.hey();     // Shows "Hi, I'm Fred" because `f` gets `hey` from its prototype 

Использование Object.create:

var fproto = { 
    hey: function() { 
     console.log("Hi, I'm " + this.name); 
    } 
}; 
var f = Object.create(fproto); // Assigns `fproto` as `f`'s prototype 
f.name = "Fred"; 
f.hey();      // Shows "Hi, I'm Fred" because `f` gets `hey` from its prototype 

Так что, если вы предпочитаете использовать только Object.create, и вы только с помощью ES5 с поддержкой двигателей, вы никогда не могли использовать Function#prototype вообще, если вам нравится.

0

В отличие от классического наследования (подобно Java), он позволяет получить доступ к атрибутам родителя.

Например:

var criminal = { 
      'name': 'John', 
      'crime': 'Murder' 
      } 
criminal.name; // 'John' 
var criminal2 = Object.create(criminal); 
criminal2.prison = 'Famous Prison'; 
criminal2.name; // 'John' 
criminal2.name = 'Tom'; 
criminal2.name; // 'Tom' 

Если это имеет смысл. Однако я могу ошибаться в сравнении с Java.

Кроме того, вы думаете о JavaScript, как будто это был другой язык. И это не так. Это JavaScript, он не имеет классов или наследования это прототип-вид языка.

Вы должны посмотреть на JavaScript: Хорошие деталиот Crockford.

Смежные вопросы