[英]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
即使foo
和bar
看起來相同,它們也指向內存中的不同位置,因此對於JS,它們並不相同!
var foo = {}; var bar = foo; bar.name = "random name"; console.log(foo.name); // "random name"
現在foo
和bar
指向相同的引用,對其中一個進行更改會反映到另一個。
在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.