1. function Teacher(){
    2. this.student = 500; // 原始值
    3. this.skill = ["JS", "JQ"]; // 引用值
    4. }
    5. var teacher = new Teacher();
    6. Student.prototype = teacher;
    7. function Student(){}
    8. var student = new Student();
    9. student.student ++;
    10. student.skill.push("HTML", "CSS");

    image.png

    • 实例是修改自身的属性,并不能修改原型上的属性
    • 如果说当前的修改是原型上的引用值,并没有修改引用,所以可以修改
    1. function Parent(){
    2. this.a = 1;
    3. this.b = [1, 2, this.a]; // 因为this.a是原始值,相当于[1, 2, 1]
    4. this.c = {
    5. demo: 5
    6. };
    7. this.show = function(){
    8. console.log(this.a, this.b, this.c.demo);
    9. }
    10. }
    11. function Child(){
    12. this.a = 2;
    13. this.change = function(){
    14. this.b.push(this.a);
    15. this.a = this.b.length;
    16. this.c.demo = this.a++; //相当于 this.c.demo = this.a; this.a = this.a + 1;
    17. }
    18. }
    19. Child.prototype = new Parent(); // 因为这里是new出来的实例,不会影响parent, child1 / child2 是同一引用相互影响
    20. var parent = new Parent();
    21. var child1 = new Child();
    22. var child2 = new Child();
    23. child1.a = 11;
    24. child2.a = 12;
    25. parent.show(); // 1 [1, 2, 1] 5
    26. child1.show(); // 11 [1, 2, 1] 5
    27. child2.show(); // 12 [1, 2, 1] 5
    28. child1.change(); // __proto__.b:[1,2,1, a->11]; a:4; __proto__.c.demo:4; a:5; ==> a:5, __proto__.b:[1, 2, 1, 11], __proto__.c:{demo:4}
    29. child2.change(); // __proto__.b:[1,2,1,11, a->12]; a:5; __proto__.c.demo:4; a:6; ==> a:6, __proto__.b:[1, 2, 1, 11, 12], __proto__.c:{demo:5}
    30. parent.show(); // 1 [1, 2, 1] 5
    31. child1.show(); // 5 [1, 2, 1, 11, 12] 5
    32. child2.show(); // 6 [1, 2, 1, 11, 12] 5