理解 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 })

输入结果 



原文地址:https://www.cnblogs.com/niceletter/p/10185703.html