2014-05-01 14 views
5

Jestem zaznajomiony z mocno napisanym językiem OOP, takim jak C# i Java, więc jestem trochę zdezorientowany przez JavaScript. Chcę, aby mój class być obudowane, na przykład:Zadeklaruj getter/setter w klasie dziedziczenia w JavaScript

function Human() { 
    var _name = ''; 
    var _nameChangeCounter = 0; 
} 

Human.constructor = Human; 
Human.prototype = Object.create(Animal); 

Jak widać, Human rozszerza klasę Animal. Teraz potrzebuję programu pobierającego i ustawiającego dla Name i gettera dla NameChangeCounter. W ustawieniu Name powinien on zwiększyć wartość NameChangeCounter. Spojrzałem w górę, jak zrobić getter i setter w JavaScript w this question:

Name.prototype = { 
    get fullName() { 
     return this.first + " " + this.last; 
    }, 

    set fullName(name) { 
     var names = name.split(" "); 
     this.first = names[0]; 
     this.last = names[1]; 
    } 
}; 

Teraz jednak, że prototyp jest brane do dziedziczenia, w jaki sposób mogę to zrobić? Czy muszę wykonać Java-style (utworzyć funkcje getName, setName, getNameChangeCounter)? W jaki sposób zaimplementowano właściwości takie jak: window.location.href?

+1

* okno * to obiekt hosta, ale jest skonfigurowany, ale implementacja chce go skonfigurować. To niekoniecznie (lub prawdopodobnie) konfiguracja przy użyciu konstruktora. Jest podobny do wbudowanych obiektów, takich jak * Math * lub * Date *, które po prostu * są *. – RobG

+0

Możesz zajrzeć do [Dokumentacja JS Mozilli o klasach i dziedziczeniu] (https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Contributor_s_Guide/Classes_and_Inheritance) oraz w bezpłatnej książce [ Eloquent JavaScript] (http://eloquentjavascript.net/). Okazało się, że są bardzo pouczające i pomocne. – pasty

+0

Nie zadzieraj DOM z JS ... są różne rzeczy ... DOM ma wiele "natywnego kodu". – rafaelcastrocouto

Odpowiedz

1

Znaleziony tej funkcji MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Summary

Oto przykład skrzypce: http://jsfiddle.net/EfyCX/1/

A oto niektóre JavaScript dla pobierające i ustawiające korzystających Object.defineProperties

Object.defineProperties(Person.prototype, { 
    "name": { 
     get: function() { return this._name }, 
     set: function(name) { 
      this.changeCount++ 
      this._name = name 
     } 
    } 
}) 
+0

To działa dla mnie, Intellisense Visual Studio nawet regconizes właściwości! –

3

Działa to dla ja:

function Name(){ 
    this.first = ''; 
    this.last = ''; 
} 

Name.prototype.getFullName = function() { 
    return this.first + ' ' + this.last; 
} 

Name.prototype.setFullName = function(fullName){ 
    var names = fullName.split(" "); 
    this.first = names[0]; 
    this.last = names[1]; 
} 


function Human() { 
    var name = new Name(), 
     counter = 0; 
    Object.defineProperty(this, 'name', { 
     configurable: true, 
     enumerable: true, 
     get: function(){ 
      return name; 
     }, 
     set: function(fullName){ 
      name.setFullName(fullName); 
     } 
    }); 
    Object.defineProperty(this, 'counter', { 
     configurable:true, 
     enumerable: true, 
     get: function(){ 
      return counter; 
     }, 
     set: function(value){ 
      counter = value; 
     } 
    }); 
} 

var luke = new Human(); 
luke.name = 'Luke Skywalker'; 

console.log(luke.name.first); //Luke 
console.log(luke.name.last); //Skywalker 
console.log(luke.name.getFullName()); //Luke Skywalker 
console.log(luke.name); //Object 

luke.name = 'Peter Parker'; 
console.log(luke.name.first); //Peter 
console.log(luke.name.last); //Parker 
console.log(luke.name.getFullName()); //Peter Parker 
-2

Próbujesz użyć dziedziczenia klasycznego w języku opartym na prototypach. W javascript nie ma definicji klas i klas. Istnieją tylko statyczne obiekty, które dzielą metody za pośrednictwem łańcucha prototypów.

Aby obiektów, które dziedziczą z Animal:

var Animal = {vertebrae: "jelly"}; 
var Human = Object.create(Animal) 

console.log(Human.vertebrae); //=> jelly 

Aby obiektów, które dziedziczą z ludzkich

var programmer = Object.create(Human); 
console.log(programmer.vertebrae); //=> jelly 

Niektóre organy JS (głównie Crockforda) zniechęcają nadrzędnymi standard dostać i zestaw metod, chyba absolutnie wiesz, co robisz.

Należy również zauważyć, że JS nie ma właściwości prywatnych, a tę funkcjonalność można uzyskać za pomocą zewnętrznego zakresu funkcji i zamknięcia. Wyszukaj prywatne właściwości javascript.

Aby dodać metody Human

Human._name = 'Human'; 
Human.getName = function(){ return this._name; } 
Human.setName = function(val){ this._name = val; } 

console.log(programmer.getName()); //=> 'Human' 

programmer.setName("Bob"); 
console.log(programmer.getName()); //=> 'Bob' 
console.log(Human.getName()); //=> 'Human' 
console.log(Animal.getName()); //=> not a function 

można użyć properties object jeśli chcesz ustawić metody robiąc Object.create(), ale składnia jest niestety gadatliwy.

Powiązane problemy