理解 javascript 中的对象的继承特性 、静态方法与私有变量
<!DOCTYPE html> <html lang="en"> <head> <script> function log(log) { console.log(log); } function Person() { { var _name = "路人甲"; var _sex = "男"; } _sex = (this.sex) ? this.sex : _sex; _name = (this.name) ? this.name : _name; this.walk = function () { log("这个" + _sex + "人在散步,他的名字叫:" + _name); } Person.speak = function (words) { log("speaking words " + words); } } function Student() { { Person.apply(this) var _name = this.name; var _count = 0; } this.study = function (lesson) { _count++; log("TA 的名字叫" + _name + ",TA 在学习 " + lesson); } this.score = function () { log("TA 考试得分:" + _count); } } var person1 = new Person(); person1.walk(); var person2 = { "name": "仓井", "sex": "女" }; Person.apply(person2); person2.walk(); log("___________________________________"); var student = { "name": "饭岛", "sex": "女" }; Student.call(student) student.study("CHINESE"); student.study("CHINESE"); student.study("CHINESE"); student.score(); Object.assign(student, { "name": "小泽" }) Student.call(student) student.walk(); log(student); log("___________________________________"); Person.speak("hehe"); </script> </head> <body> </body> </html>
Person为基类, Student 通过 Person.apply(this) 继承基类
类中 {}的部分 可以理解为 构造函数,可以执行一些默认值之类的 ,
代码运行结果如下:
_count 可以理解为内部私有变量, 保持私有变更
注意:这里需要说明一下
Object.assign(student, { "name": "小泽" }) 前后,
虽然 assign 合并之后 ,对象student 已经变更,但是很遗憾,并未改变student 的行为,如walk方法
只有对象Student.call(student) 之后,才改变了walk 方法
这里也有必要特地说明一下 assign方法,该方法为对象并集,后加入参数优先,类似于栈的后进先出,合并后改变第一个参数对象值,看如下示例:
const object1 = { a: 1, b: 2, c: 3 }; var object3 ={c: 4, d: 5}; const object2 = Object.assign(object3, object1); console.log(object2.c, object2.d); // expected output: 3 5 console.log(object1); console.log(object2) console.log(object3) console.log(object2===object3) console.log(object2==={ c: 3, d: 5, a: 1, b: 2 })
输入结果