2010-10-21 4 views
3

HI,Используя прототип объекта правильно

У меня есть программа, которая JavaScript написанный с объектом буквального синтаксиса:

var MyJsProgram = { 

    someVar: value1, 
    somevar2: value2, 

    init : function() { 
     //do some initialisation 
    }, 

    libraryFunction : function() { 

    }, 

    getStyle : function() { 

    }, 

    extend : function() { 

    } 
} 

Там может быть несколько экземпляров этого сценария работает сразу. Должен ли я перемещать общие методы в прототип объекта myJsProgram? Если это так, - этот синтаксис правильный?

var MyJsProgram = { 

    someVar: value1, 
    somevar2: value2, 

    init : function() { 
     //do some initialisation 
    }, 

    //more methods/members here that are unique to each instance 
} 

myJsProgram.prototype = { 
    //all shared methods here 
} 

?

+0

Является ли это о наследовании ? Класс 'programs', который расширяется несколькими классами, например' subprogram'? – Harmen

ответ

2

Нет, что синтаксис не является правильным (без обид);)

Вы должны создать объект для использования своих прототипов. Это означает, что вам нужен конструктор (который является функцией в JavaScript). Применительно к вашей проблеме:

var MyJsProgram = function (value1, value2) { 
    // "this" refers to the current instance of this object 
    this.someVar = value1; 
    this.someVar2 = value2; 
    // do some initialization 
}; 

Создать новый объект, как это:

var jsProgramInstance = new MyJsProgram(value1, value2); 

Прототипы являются членами экземпляра этих объектов. Они определяются следующим образом:

MyJsProgram.prototype.someSharedMethodName = function() { 
    // do shared method stuff here 
    // (this.someVar and this.someVar2 are available here) 
}; 

Используйте их, как это (на вашем ранее созданный экземпляре):

jsProgramInstance.someSharedMethodName(); 

Вы должны не сделать следующее, так как он заменяет существующие свойства прототипа, который может есть (из-за наследования):

MyJsProgram.prototype = { 
    someSharedMethodName: function() { 
     // ... 
    }, 
    // ... 
}; 
+0

no offsense took :) –

3

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

// Make it a function, so you can make a new instance 
var stdProgram = function(){}; 

// All shared methods go here 
stdProgram.prototype = { 
    echo: function(message){ 
    alert(message); 
    }, 
    extend: function(key, value){ 
    this[key] = value; 
    } 
}; 

Тогда вы могли бы сделать свою специфическую «программу», на самом деле только экземпляры базового класса

// And here you can make instances for specific programs 
var myFirstProgram = new stdProgram(), 
    mySecondProgram = new stdProgram(); 

myFirstProgram.extend('unique', function(){ 
    alert('I am unique'); 
}); 

mySecondProgram.aVar = 'test'; 

Чтобы убедиться, что все работает, попробуйте следующее:

myFirstProgram.unique();  // Should alert I am unique 
mySecondProgram.unique(); // Should throw an error, unique is undefined 

alert(mySecondProgram.aVar); // Should alert test 
alert(myFirstProgram.aVar); // Should echo undefined 

myFirstProgram.echo('hi'); // Should alert hi 
mySecondProgram.echo('hi'); // Should alert hi 
+0

Этот ответ имеет больше голосов, но сообщение ниже, как сказано ниже, не использует этот синтаксис при создании прототипа, потому что он переопределит любые существующие свойства прототипа. Я знаю, что это правильно, но если я знаю, что единственные свойства прототипа будут в stdProgram.prototype = {}, тогда это не имеет значения ... правильно? –

+0

@elduderino: вы _can_ перезаписываете свойство prototype, но оно не рекомендуется, так как оно разрушает наследование (вот что такое прототипы). – jwueller

+0

@elusive ... но почему это нарушает наследование? Если я знаю, что все унаследованные свойства будут в этом объекте прототипа, то где же наследование будет нарушено? –

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