2010-11-01 9 views

Odpowiedz

7

Wbudowany owijarki obiektów (utworzony z Boolean, Number, String i Date constuctors) zachować pierwotny owinięty wartość we właściwości wewnętrznej nazwie [[PrimitiveValue]], które nie mogą być zmienione, ale ...

można zastąpić metodę valueOf swojego obiektu test:

var test = new Boolean(0); 
test.prop = "OK!" 
// override valueOf: 
test.valueOf = function() { return true; }; 

if (test == true) { // using the equals operator explicitly for type conversion 
    alert(test.prop); //"OK!" 
} 

Będzie działać, ponieważ metoda valueOf jest używana wewnętrznie przez mechanizmy konwersji typu uruchomione przez operatora równości.

Gdy jeden z operandów jest wartością logiczną, oba są konwertowane na końcu na Number.

Jeśli nie używa operatora równości (np if (test) { ... }), ponieważ test jest obiektem, po konwersji bezpośrednio logiczną, będzie zawsze dają true.

Każdy obiekt przekształca się logiczną spowoduje wartość true jedyne wartości, które wytwarzają false efekcie są wartości „falsey” (null, undefined, 0, NaN pusty tekst, i oczywiście wartość false), cokolwiek innego będzie produkować true.

Więcej informacji:

+0

chociaż reprezentacja ciąg pozostaje 'FALSE, ponieważ wartość bazowy nie zmieniła .. –

+2

@Gaby, cóż, to zależy od tego, w jaki sposób konwersja typu jest wykonana, na przykład, jeśli łączymy z nim ciąg znaków, np 'test + ''' wynikiem będzie "true" (najpierw użyty zostanie "valueOf"), jeśli użyjesz konstruktora 'String' jako funkcji, np .:' String (test); 'to wywoła Metoda '' Boolean.prototype.toString'] (http://ecma262-5.com/ELS5_HTML.htm#Section_15.6.4.2). Zgadzam się, dobrze jest również zastąpić 'toString'. – CMS

+0

ah bardzo ładne .. Właśnie zaalarmowałem wartość 'alert (test)' i wyświetliło 'false'. Wygląda na to, że metoda 'alert' używa konstruktora String lub wywołuje' toString' na swoich argumentach .. dzięki dla głów. –

1

nr

var test = new Boolean(0); 

tworzy nowy obiekt i umieszcza odniesienie do niej w 'test'

test.prop = 'ss' 

dynamicznie stawia nowa właściwość obiektu (meta-programowanie FTW!)

test = true; 

przypisuje test do typu pierwotnego typu Boolean. Odniesienie do obiektu Boolean zostanie utracone.

Wreszcie, obiekt Boolean nie ma żadnych metod przełączania lub ponownego przypisywania jego wartości, tj. Obiekty Boolean są niezmienne.

Jednak można dodać metodę Boolean.prototype to zmienić, jeśli chcesz ....

0

owijki obiektów utworzyć niezmienna typu odniesienia w JS. Ponieważ w JS pierwotne typy danych są niezmienne, ich odniesienia również powinny być niezmienne.Może to być przydatne w rzadkich przypadkach, ale najprawdopodobniej nie zrobi tego, co chcesz. Na przykład, jeśli chcesz zmienić pierwotną wartość źródła i obejrzeć odniesienia do niego, nie możesz użyć konstruktora obiektów, aby osiągnąć pożądany efekt. Najlepszym rozwiązaniem byłoby uniknięcie konstruktora Object i użycie odpowiedniego literału obiektowego do umieszczenia pierwotnej wartości w ramach właściwości w następujący sposób;

var pv = "test", 
 
    pvr = {0: pv}, 
 
    arr = new Array(5).fill().map(_ => pvr); 
 
console.log(JSON.stringify(arr)); 
 
pvr[0] = "Hello"; 
 
console.log(JSON.stringify(arr));

Powiązane problemy