我不了解该程序的工作

时间:2019-09-03 07:45:13

标签: javascript object

我正在用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的工作方式,为什么如果我删除该行则没有显示输出?

1 个答案:

答案 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

尽管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将不会继续执行程序的其余部分(您可以在console中打开dev tools标签,并在那里查看错误)。

希望有帮助, 干杯!