js创建对象模式与继承方式小结

创建js对象必须知道的4种方法#


欢迎指正!

  1. 工厂模式

    简单说明:通过函数中创建新的对象,赋予属性后,再返回该对象。该方法一般不适用

    function sayName() {
    console.log(this.name);
    }

    function Person1 (name, age) {
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.sayName = sayName;

    return obj;
    }

    var person1 = Person1('susan', 21);
    person1.sayName();

  2. 构造函数模式

    简单说明:无需在函数中创建对象而使用this指代,且无需返回

    function Person2 (name, age) {
    this.name = name;
    this.age = age;
    this.sayName = sayName;
    }

    var person2 = new Person2('susan', 21);
    person2.sayName();

  3. 原型模式

    在函数中不对属性进行定义,而是使用prototype属性进行定义

    function Person3 () {}

    Person3.prototype.name = 'susan';
    Person3.prototype.age = 21;
    Person3.prototype.sayName = sayName;

    var person3 = new Person3();
    person3.sayName();

  4. 混合构造函数模式与原型模式(推荐)

    该方法集合了两种模式的优点,既可以做到对象拥有私有属性,又可以公用其中的一些方法

    function Person4 (name, age) {
    this.name = name;
    this.age = age;
    }

    Person4.prototype.sayName = sayName;

    var person4 = new Person4('susan', 21);
    person4.sayName();

js继承必须知道的4种方法


  1. 原型链继承。

    简单说明:子类的原型对象为基类的实例函数

    (function () {
    function SuperType() {
    this.property = true;
    this.exist = 'yes';
    }

    SuperType.prototype.getSuperValue = function () {
    return this.property;
    }

    function SubType() {
    this.subproperty = false;
    }

    //继承SuperType
    SubType.prototype = new SuperType();
    //避免使用字面量方法设置
    SuperType.prototype.getSubValue = function () {
    return this.subproperty;
    }

    var instance = new SubType();
    console.log(instance.getSuperValue()); //true
    }());

  2. 构造函数继承

    在子类中使用call/apply调用父类

    (function () {
    function SuperType() {
    this.colors = ['red', 'blue', 'pink'];
    }

    function SubType() {
    SuperType.call(this);
    }

    var instance1 = new SubType();
    instance1.colors.push('black');
    console.log(instance1.colors); //["red", "blue", "pink", "black"]

    var instance2 = new SubType();
    console.log(instance2.colors); //["red", "blue", "pink"]
    }());

  3. 原型式继承

    使用Object.create(),返回的新对象以括号内的对象为原型,其中可以对私有属性进行更改,而方法也得到了公用。不足点在于当数据为数组时,会共享这个数组。

    var sub = Object.create(person);
    sub.name = 'jack';
    sub.colors.push('white');
    console.log(sub.name); //jack
    var subs = Object.create(person);
    subs.name = 'jan';
    subs.colors.push('pink');
    console.log(subs.name); //jan
    console.log(subs.colors); //["red", "black", "white", "pink"]

  4. 拷贝继承

    拷贝一个对象的所有属性和方法,缺点是无法获取基类不能枚举的属性

    function Animal () {
    this.name = 'susan';
    this.age = 21;
    this.sayName = function () {
    console.log(this.name);
    }
    }

    Animal.prototype.sayAge = function () {
    console.log(this.age);
    }

    function Cat () {
    var animal = new Animal();

    for (var p in animal) {
    Cat.prototype[p] = animal[p];
    }
    }

    Cat.prototype.sayHi = function () {
    console.log('hi');
    }

    var cat = new Cat();
    cat.sayAge(); //21
    cat.sayName(); //susan
    cat.sayHi(); //hi

posted @ 2017-03-15 20:29  susantong  阅读(145)  评论(0)    收藏  举报