我正在用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
的工作方式,为什么如果我删除该行则没有显示输出?
答案 0 :(得分:2)
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将不会继续执行程序的其余部分(您可以在console
中打开dev tools
标签,并在那里查看错误)。
希望有帮助, 干杯!