2012-12-04 19 views
6

Perché non funziona ??Come creare un nuovo oggetto in JavaScript?

var sheep = function(options){ 
     this.options = {sizes: 100, 
         eat: 100, 
       colors: 'white', 
       running: function() { 
        return this.sizes + this.eat; 
       } 
      } 
    }; 

    var blacksheep = new sheep({colors:'black'});  

    alert('blackcsheep color is ' + blacksheep.colors);//error undefined 
    alert('blackcsheep color is ' + blacksheep.options.colors);// it return white 
    alert('blackcsheep running is ' + blacksheep.running());//error 
+1

'sheep' è già un oggetto.Penso che leggere le nozioni di base su JavaScript ti aiuterebbe di più: [MDN JavaScript Guide] (https://developer.mozilla.org/en-US/docs/JavaScript/Guide), specialmente [Working with Objects] (https: // developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects). –

+0

@FatDogMark: cosa vuoi esattamente. la pecora è già un oggetto. – karthick

+0

ma come faccio a creare un'altra pecora nera sulle pecore? ereditare le proprietà degli ovini – FatDogMark

risposta

3

La sintassi:

var sheep = {sizes:100, eat:100, colors:'white',running:function(){ 
     return this.sizes+this.eat; 
     } 
    }; 

è un oggetto letterale. Definisce un'istanza di un oggetto, ma non la classe che lo definisce. Pertanto, non c'è modo di "rinnovare" un'altra istanza dell'oggetto.

Date un'occhiata a funzionalità di jQuery extend:

var blacksheep = { 
} 

$.extend(blacksheep, sheep, { color: black }); 

Questo copierà tutte le proprietà di sheep in blacksheep, quindi unire il terzo parametro in blacksheep, in modo efficace ottenendo ciò che si desidera.

+0

$ .extend è solo una comodità per me, va bene, accetto la risposta – FatDogMark

1

Per fare un altro pecora nera sulla base di pecore, in questo scenario si potrebbe fare (usando jQuery):

var blacksheep = $.extend(sheep, { color: 'black' }); 
+1

E senza jQuery? –

+0

Non lo farei in questo modo senza jQuery. La clonazione degli oggetti è disordinata - dovrebbe essere usato un esempio con funzione Sheep() {...}. Riferimento http://stackoverflow.com/questions/728360/copying-an-object-in-javascript per la clonazione di oggetti javascript. –

1

È possibile creare un oggetto di pecora come questo.

function Sheep(sizes,eat,colors){ 
    this.sizes = sizes; 
    this.eat = eat; 
    this.colors = colors; 
    this.running = function(){ 
    return this.sizes+this.eat; 
    } 

    } 

In alternativa è possibile scrivere in questo modo anche

function Sheep(sizes,eat,colors){ 
    this.sizes = sizes; 
    this.eat = eat; 
    this.colors = colors;   
    } 
sheep.prototype.running = function(){ 
return this.sizes + this.eat;  
} 

var sheep1 = new Sheep ('100', '100', 'bianco');

1
var sheep = function(){ 
    this.sizes = 100; 
    this.eat = 100; 
    this.colors = 'white'; 
    this.running = function(){ 
     return this.sizers + this.eat; 
    } 
} 
+0

perché dovrei aver bisogno di "questo" in tutte le variabili ... non posso semplicemente avvolgere il mio oggetto pecora in una funzione e trasformarlo in classe? – FatDogMark

+0

var a = nuove pecore(); a ora ha dimensioni di proprietà ... a causa di 'questo' – karaxuna

+0

'questo' è attuale classe ovina. Leggi qui cosa vuol dire: http://www.quirksmode.org/js/this.html – karaxuna

-1

Javascript è un prototipo basato non basato sulla classe. Non usa le classi ed è anche orientato agli oggetti.

var whitesheep =new sheep("100","100","white","running"); 
var blacksheep =new sheep("100","100","black","running"); 
+1

Hai provato questo nella console del browser? questo non funzionerà se non si definisce un oggetto funzione e si restituisce un tipo di oggetto che ha le sue proprietà come i valori passati. –

1

non si dichiara oggetti in JavaScript nello stesso modo come si fa in lingue fortemente tipizzato. Dichiarate gli oggetti utilizzando le funzioni in questo modo:

function sheep() { 
    this.color = "white"; 
    this.size = 200; 
    this.speed = 100; 
    this.running = function() { 
     return "the sheep is running!"; 
    }; 
} 

var blacksheep = new sheep(); 

alert('sheep size is ' + blacksheep.size); 
alert('sheep running is ' + blacksheep.running());​ 

tuo nuovo oggetto non funziona perché si sta creando un nuovo oggetto con un sub-oggetto chiamato options. options contiene tutti i tuoi metodi. Come tale solo il secondo di questi tre linee che hai dato vi darà la risposta corretta:

alert('blackcsheep color is ' + blacksheep.colors); 
alert('blackcsheep color is ' + blacksheep.options.colors); // Only this one correctly references `options`. 
alert('blackcsheep running is ' + blacksheep.running()); 
+0

Vedo che alcune persone rendono la classe non necessario a questo tutto ciò che mette this.options {...} quindi può creare un nuovo oggetto come blacksheep = new sheep ({colors: 'black', sizes = 10}); , come farlo?? – FatDogMark

+0

Il mio primo esempio mostra come fare proprio questo. Quando chiami la funzione 'new sheep()', 'this' fa riferimento al nuovo oggetto che si sta creando. Ciò che 'var blacksheep = new sheep()' fa è applicare tutte le proprietà referenziate da 'this' nella funzione' sheep() 'alla variabile' blacksheep'. Come tale, puoi quindi fare riferimento come ho fatto, 'blacksheep.size',' blacksheep.running() 'e così via. Prova questo qui: http://jsfiddle.net/SZQVn/ –

0

nel tuo caso pecore è già un oggetto non è possibile creare l'oggetto di un oggetto. puoi usare direttamente quell'oggetto con proprietà.

ma penso che si desidera qualcosa di simile

var pecore = {dimensioni: 100, mangia: 100, colori: 'bianco', in esecuzione: function() {return this.sizes + questo. mangiare; } }; Object.defineProperty (sheep, 'colors', {value: 'black' , scrivibile: true});

Grazie

Problemi correlati