簡體   English   中英

我不了解該程序的工作

[英]I don't understand working of the program

我正在用JavaScript學習對象,當通過用戶定義的函數定義對象時,我不理解分配給對象的屬性的方法。

這是來自point.com/JavaScript教程的代碼片段

 <script type = "text/javascript"> function addPrice(amount) { with(this){ price = amount; } } function book(title, author) { this.title = title; this.author = author; this.price = 0; this.addPrice = addPrice; } </script> <script type = "text/javascript"> var myBook = new book("Perl", "Mohtashim"); myBook.addPrice(100); document.write("Book title is : " + myBook.title + "<br>"); document.write("Book author is : " + myBook.author + "<br>"); document.write("Book price is : " + myBook.price + "<br>"); </script> 

我想知道this.addPrice = addPrice的工作方式,為什么如果我刪除該行,則不會顯示任何輸出?

JS是非常靈活的語言。 在JS中:

 var obj = { name: "Raju Ritigya", sayHi: function() { console.log("hello, I'm " + this.name); } }; 

與此相同:

 var obj = {}; obj.name = "Raju Ritigya"; obj.sayHi = function() { console.log("hello, I'm " + this.name); }; 

基本上,有兩種向JS中的對象添加屬性和方法的方法。

話雖這么說,您的課程正在教您如何在JS中編寫“類”,構造函數以及this IMO,如果您只是從JS開始,這太復雜了,難以理解。 JS本身不支持類,而是嘗試通過原型繼承來模仿它們。

但是無論如何,這是我的0.02美元

在JS中,您具有原始類型( 字符串,數字,布爾值,符號,null,未定義 ),其他所有對象都是對象( 是,數組是對象,函數是對象,對象是對象 )。

原始值按值傳遞,並且它們是不可變的,但是對象按引用傳遞( 內存中的一個點 ),並且它們是可變的

 var foo = {}; var bar = {}; console.log(foo === bar) //false 

即使foobar看起來相同,它們也指向內存中的不同位置,因此對於JS,它們並不相同!

 var foo = {}; var bar = foo; bar.name = "random name"; console.log(foo.name); // "random name" 

現在foobar指向相同的引用,對其中一個進行更改會反映到另一個。

在JS中,每個函數都需要返回一些內容。 如果未在函數中顯式放置return語句,則它將返回undefined並且如果在函數調用之前使用new關鍵字,則它將返回一個具有該函數作為構造函數的新對象。

因此,總而言之,這里發生的是您有一個構造函數( book ),該構造函數將返回具有3個屬性( author,title,price )和一個方法( addPrice )的對象。 該方法是一個函數(正如我們已經說過的那樣,函數是JS中的對象,可以輕松地傳遞)。 如果您這樣編寫構造函數,則將完全相同:

 function book(title, author) { this.title = title; this.author = author; this.price = 0; this.addPrice = function(amount) { this.price = amount }; } 

如@deceze所述,強烈建議不要使用with

通過刪除this.addPrice = addPrice行,您無需向對象添加方法,但是稍后您嘗試在此行上調用myBook.addPrice(100);

您的代碼在該行中斷,並且JS將不會繼續執行程序的其余部分(您可以在dev tools打開console標簽,然后在其中查看錯誤)。

希望能有所幫助,干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM