第二章 对象高级

一、对象创建模式

1.Object构造函数

 缺点:  
/* 1. 组织形式不好 2. 没有类型 3. 内存开销大 4. 代码冗余 */ var obj = new Object(); obj.age=18; obj.name="zyy"; obj.say=function () { console.log("城市套路深 我要回农村 农村路更滑 人心更复杂") } var obj2 = new Object(); obj2.age=19; obj2.name="zyy"; obj2.say=function () { console.log("-----") }

 2.字面量

缺点:

/*
  2. 没有类型
  3. 内存开销大
  4. 代码冗余
*/

改善:

// 1. 组织形式比较友好

 
var obj ={ name:"zyy", age:18, say:function () { console.log("----") } } var obj2 ={ name:"zyy2", age:38, say:function () { console.log("*****") } }

 3.工厂模式

缺点: 
/* 2. 没有类型 3. 内存开销大 */ 改善: // 1. 组织形式比较友好 // 4. 代码不冗余 function createObj(name,age,msg) { return { name:name, age:age, say:function (msg) { console.log(msg) } } } var obj = createObj("damu",18,"胡话"); var obj2 = createObj("zyy",48,"鬼话"); console.log(obj,obj2)

 4.自定义构造函数

缺点:
/* 3. 内存开销大 */ 改善: // 1. 组织形式比较友好 // 4. 代码不冗余 // 2. 拥有类型 function Person(name,age) { // var food; this.name =name; this.age =age; this.eat=function (food) { // var food; console.log(food) } } var damu = new Person("达姆",18); damu.eat("核桃"); var fyz = new Person("张艳英",48); fyz.eat("大嘴巴子"); // console.log(damu instanceof Person,fyz);

 5.自定义构造函数+原型链

 改善:   
//
1. 组织形式比较友好 // 4. 代码不冗余 // 2. 拥有类型 // 3. 内存开销相对减少 Person.prototype.eat=function (food) { console.log(this.name+"吃"+food) } function Person(name,age,food) { this.name =name; this.age =age; } var damu = new Person("达姆",18); damu.eat("核桃"); var fyz = new Person("张艳英",48); fyz.eat("大嘴巴子");

 6.create函数

<script>
    var obj ={};// __proto__
    console.log(obj)

    // var 对象 = Object.create(obj)   
    //       会创建出一个对象  只是这个对象的隐式原型会被显式的指定  指定为obj
    var obj2 = Object.create({a:"a"})
    console.log(obj2)
</script>

二、继承模式

1.原型链继承

(1)继承套路

1.定义父类型构造函数
2.给父类型的原型添加方法
3.定义子类型的构造函数
4.创建父类型的对象赋值给子类型的原型
5.将子类型原型的构造属性设置为子类型
6.给子类型原型添加方法
7.创建子类型的对象:可以调用父类型的方法

(2)代码演示

 // 属性还是使用构造函数继承的方式
    // 函数使用原型链继承
    //  污染了父类

    Person.prototype.eat = function () {
        console.log("eat")
    };
    function Person(name,age) {
        this.name = name;
        this.age = age;
    }

    Teacher.prototype = Person.prototype;
    Teacher.prototype.teach=function () {
        console.log("teach")
    }
    function Teacher(classNo,name,age) {
        Person.call(this,name,age);
        this.classNo =classNo;
    }


    var damu = new Teacher("18_1128","达姆",18)
    console.log(damu.teach,damu.eat);

2.构造函数继承

 function Person(name,age) {
        this.name = name;
        this.age = age;
        this.eat = function () {
            console.log("eat")
        };
    }


    function Teacher(classNo,name,age) {
        Person.call(this,name,age);
        this.classNo =classNo;
        this.teach=function () {
            console.log("teach")
        }
    }
    function Student(id,name,age) {
        Person.call(this,name,age);
        this.id =id;
        this.study=function () {
            console.log("study")
        }
    }

    var damu = new Teacher("18_1128","达姆",18)
    console.log(damu);

    var lxf = new Student("38","张艳英",18)
    console.log(zyy);

3.组合继承(原型链+构造函数)

 // 属性还是使用构造函数继承的方式
    // 函数使用原型链继承
    //  污染了父类

    Person.prototype.eat = function () {
        console.log("eat")
    };
    function Person(name,age) {
        this.name = name;
        this.age = age;
    }

    Teacher.prototype = new Person();
    Teacher.prototype.constructor = Teacher;
    Teacher.prototype.teach=function () {
        console.log("teach")
    }
    function Teacher(classNo,name,age) {
        Person.call(this,name,age);
        this.classNo =classNo;
    }


    var p = new Person("张艳英",28)
    console.log(p.teach,p.eat);

    var damu = new Teacher("18_1128","达姆",18)
    console.log(damu.teach,damu.eat);
原文地址:https://www.cnblogs.com/fxiong/p/10158982.html