- 作为对象属性的函数被称为 方法。(类比python)
// 这些对象作用一样 let user = { sayHi: function() { alert("Hello"); } }; // 简写 let user = { sayHi() { // 与 "sayHi: function(){...}" 一样 alert("Hello"); } };
以上两种是声明方法的常见方法。
-
为了访问对象,方法中可以使用this作为关键字(来指代这个对象),this的值就是在点之前的这个对象,即调用该方法的对象。
et user = { name: "John", age: 30, sayHi() { // "this" 指的是“当前的对象” alert(this.name); } }; user.sayHi(); // John
实际上也可以直接用对象的名称来指代,但是如果复制该对象,并让原本的对象名无法指向该对象,就可能会出错。
let user = { name: "John", age: 30, sayHi() { alert( user.name ); // 导致错误 } }; let admin = user; user = null; admin.sayHi(); // TypeError: Cannot read property 'name' of null
新手对this有大致了解,知道它可以指代之前出现的对象即可。
-
链式调用
let ladder = { step: 0, up() { this.step++; }, down() { this.step--; }, showStep: function() { // 显示当前的 step alert( this.step ); } };
有一个可以上下移动的
ladder
对象:如果我们要按顺序执行几次调用,可以这样做ladder.up(); ladder.up(); ladder.down(); ladder.showStep(); // 1 ladder.down(); ladder.showStep(); // 0
修改
up
,down
和showStep
的代码,让调用可以链接,就像这样:ladder.up().up().down().showStep().down().showStep(); // 先展示 1,然后是 0
答案:在每次调用后返回这个对象本身。
let ladder = { step: 0, up() { this.step++; return this; }, down() { this.step--; return this; }, showStep() { alert( this.step ); return this; } }; ladder.up().up().down().showStep().down().showStep(); // 展示 1,然后 0
这种方法称为链式调用,在 JavaScript 库中被广泛使用。
-
构造函数(constructor function)存在的意义是利用同一个对象模板创造多个实例,例如user
// User是一个函数 function User(name) { this.name = name; this.isAdmin = false; } let user = new User("Jack"); // user是新创建的一个对象 alert(user.name); // Jack alert(user.isAdmin); // false
这样,仅用一行代码就完成了对象user的创建。比每次都使用字面量创建要短得多,而且更易于阅读。
-
构造函数的规则:1.它们的命名以大写字母开头。2.只能由
"new"
操作符来执行。(当一个函数被使用new
操作符执行时,它按照以下步骤:一个新的空对象被创建并分配给this;
函数体执行,通常它会修改this
,为其添加新的属性;返回this
的值。)像这样:function User(name) { // this = {};(隐式创建) // 添加属性到 this this.name = name; this.isAdmin = false; // return this;(隐式返回) }
-
构造器(构造函数)的return语句,如果是一个object,则返回这个object;否则返回this。