2013-10-04 3 views
2

Рассмотрим имеющий ниже кодJavaScript наследуемые свойства Значение по умолчанию

function Employee() { 
    this.id = ""; 
    this.name = ""; 
    this.gender = ""; 
} 

function Programmer() { 
    this.expertise = ""; 
} 

Programmer.prototype = new Employee(); 

А потом я хочу, чтобы наследовать программатора дальше JScriptProgrammer со значением по умолчанию «экспертизы» установлен в «JavaScript».

Вопрос: Что такое различию между

function JScriptProgrammer() { 
    this.expertise = "JavaScript"; 
} 

JScriptProgrammer.prototype = new Programmer(); 

и

function JScriptProgrammer() { 
} 

JScriptProgrammer.prototype = new Programmer(); 
JScriptProgrammer.prototype.expertise = "JavaScript"; 
+0

Это то же самое отличие, что и определение свойств прототипа против каждого экземпляра. Дубликат [Использование «прототипа» против «этого» в Javascript?] (Http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) Используете ли вы «новый Экземпляр программиста для прототипа или нет (простой объект) не имеет никакого значения. – Bergi

+0

Кроме того, [не используйте 'new' для наследования] (http://stackoverflow.com/questions/12592913/what-is-the-reason-to-use-the-new-keyword-here). – Bergi

ответ

1

Вы можете использовать прототип для значений по умолчанию для объекта и сохранять память. Если впоследствии вы не затеняете свойство позже (назначьте ему новое значение в экземпляре), все экземпляры будут иметь один и тот же указатель на значение.

Если же вы наверняка собираетесь присвоить ему значение, то лучше определить его в теле конструктора, как this.myval

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

var Person=function(){}; 
Person.prototype.teeth=[0,1,2,3]; 
Person.prototype.legs={left:1,right:1}; 

var ben=new Person(); 
var betty=new Person(); 
ben.teeth.splice(2,1);//ben looses a tooth 
//when ben looses a tooth like that betty looses it too 
console.log(betty.teeth);//[1,2,3] poor betty 
//now poor betty has an accident 
betty.legs.right=0; 
//looks like ben looses it too 
console.log(ben.legs);//{left:1,right:0} 
//I don't feel sorry for ben though because 
//he knocked out betty's tooth 

Лучше не начинать новый экземпляр для наследования, вы можете использовать Object.create или вспомогательную функцию, чтобы установить наследование без создания экземпляра , Все о наследовании, прототипе, переопределении и вызове super здесь: https://stackoverflow.com/a/16063711/1641941

+0

Awesome! Поэтому плохо использовать прототип для определения значения по умолчанию для свойства, поскольку он станет общим членом для всего экземпляра объекта. Благодаря!! Очень ценю ответ! :) – ch0eb1t

+0

@ ch0eb1t Добро пожаловать. В библиотеках закрытия google все примитивные значения определены на прототипе. Так что строка, число и логическое значение прекрасны. Объекты могут использоваться, но вы никогда не сможете их манипулировать, всегда назначайте их значение. Когда ваш код используется другими программистами, они могут не знать этого и получать неожиданные результаты, поэтому для членов класса, которые должны быть конкретными экземплярами, я бы не указал их на прототипе. – HMR

-1

В Resumen:

прототип является использование унаследовать существующего объекта. Например. Если вы хотите добавить новый метод к объекту Array, вы можете сделать это

Array.prototype.MyNewMethod = function() 
{ 
alert("im bellow to array object") 
} 

Это означает, что вы можете с этим

var array = [1,2,3]; 
array.MyNewMethod();//prints im bellow to array object 

(read this post for more reference)

Это означает, что ваш код делает это:

 function JScriptProgrammer() { 
     } 
     function Programmer(){ 
     this.name = "hello world"; 
     } 
     JScriptProgrammer.prototype = new Programmer();// inhering from Programmers object(or lets say class) 
     JScriptProgrammer.prototype.expertise = "JavaScript"; // assigning a value to expertise property that belows to JScriptProgrammer class 



console.log(new JScriptProgrammer())//JScriptProgrammer {name: "hello world", expertise: "JavaScript"} notice that property name that bellow to Programmer 
object now is in JScriptProgrammer object as well. 

здесь тест http://jsbin.com/IgOFimi/1/edit

+0

Я не знаю, на что это должно ответить, но код на самом деле ничего не демонстрирует. – Nicole

+0

@ Misters: Извините, но я прошу разницу в назначении значения по умолчанию для объекта. используя как this.expertise, так и prototype.expertise делает работу просто отлично. Все, что я хочу знать, - это разница между этими двумя. Очевидно, что должен быть случай, когда использование этого является более предпочтительным, или когда использование прототипа является более предпочтительным. – ch0eb1t

0

разница

function JScriptProgrammer() { 
this.expertise = "JavaScript"; 
} 
JScriptProgrammer.prototype = new Programmer(); 

Средства при использовании JScriptProgrammer() значение экспертизы уже установлено значение "JavaScript"

, но при использовании

function JScriptProgrammer() 
{ 
} 
JScriptProgrammer.prototype = new Programmer(); 
JScriptProgrammer.prototype.expertise = "JavaScript"; 

означает, что вы установите экспертная ценность после использования JScriptProgrammer()

+0

Я не думаю, что это правильный ответ. См. Http://jsbin.com/OQEBaHu/1/edit выход журнала «JavaScript» вместо «Not JavaScript». Если использование прототипа будет устанавливать значение позже после вызова construtor, то в этом примере в журнале должен быть «Not JavaScript», а не «JavaScript» – ch0eb1t

0

Это такой же. Вторая версия сохраняет память, то есть все дети используют один и тот же экземпляр функции/переменной.

См следующий пример, который показывает, почему this может потребоваться

function JScriptProgrammer() { 
    var tmp = "Hello"; 

    //accessing private variables 
    this.sayHello = function() { 
     alert(tmp + " "+ this.expertise + "er"); 
    } 
} 

JScriptProgrammer.prototype = new Programmer(); 
JScriptProgrammer.prototype.expertise = "JavaScript"; 

Больше чтения

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