JavaScript创建对象

一、原型”__proto__”

//__proto__
var Mazey1 = {
    name: 'Mazey1',
    say: function(){
        console.log('Hi, i\'m ' + this.name + '!');
    }
};
var Cherrie1 = {
    name: 'Cherrie1'
};
Cherrie1.__proto__ = Mazey1;
Cherrie1.say(); //Hi, i'm Cherrie1!

低版本IE不支持,不推荐使用。

二、方法”Object.create()”

//Object.create
var Mazey2 = {
    name: 'Mazey2',
    say: function(){
        console.log('Hi, i\'m ' + this.name + '!');
    }
};
function createMazey(name){
    var m = Object.create(Mazey2);
    m.name = name;
    return m;
}
var Cherrie2 = createMazey('Cherrie2');
Cherrie2.say(); //Hi, i'm Cherrie2!

三、构造函数”function”

//function
function Mazey3(name){
    this.name = name;
    this.say = function(){
        console.log('Hi, i\'m ' + this.name + '!');
    }
}
var Cherrie3 = new Mazey3('Cherrie3');
Cherrie3.say(); //Hi, i'm Cherrie3!

四、构造函数”function” – 多个对象共用方法

//function 多个对象共用say
function Mazey4(name){
    this.name = name;
}
Mazey4.prototype.say = function(){
    console.log('Hi, i\'m ' + this.name + '!');
}
var Cherrie4 = new Mazey4('Cherrie4');
Cherrie4.say(); //Hi, i'm Cherrie4!
var Luna4 = new Mazey4('Luna4');
Luna4.say(); //Hi, i'm Luna4!

节省内存,推荐使用。

五、类的继承/call/2017-07-28

//类1
function Mazey(name){
    this.name = name;
    this.say = function(){
        console.log('Hi, i\'m ' + this.name + '.');
    };
}
//用原型继承不了方法
Mazey.prototype = {
    run: function(){
        console.log(this.name + 'is running.');
    }
};
var Cherrie = new Mazey('Cherrie');
Cherrie.say(); //Hi, i'm Cherrie.
Cherrie.run(); //Cherrieis running.

//类2 继承类1 call
function Baby(name){
    Mazey.call(this, name);
    this.eat = function(){
        console.log(this.name + ' eats rice.');
    };
}
LittleBaby = new Baby('Baby');
LittleBaby.say(); //Hi, i'm Baby.
LittleBaby.eat(); //Baby eats rice.
LittleBaby.run(); //Uncaught TypeError: LittleBaby.run is not a function

原始类的原型”prototype”继承不了,把不需要继承的方法属性放在原型里面。

六、类的继承/ECMAScript6/2017-08-03

//类1
class Mazey {
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    say(){
        console.log(`My name is ${this.name}, i'm ${this.age}.`);
    }
    info(){
        return `${this.name}, ${this.age}`;
    }
}
var m1 = new Mazey('mazey', 18);
m1.say(); //My name is mazey, i'm 18.
//类2
class Cherrie extends Mazey {
    constructor(name, age, sex){
        super(name, age); //super一定要放在this前面,等于 Mazey.call(this, name, age)
        this.sex = sex;
    }
    say(){
        super.say();
        console.log(`I am a ${this.sex}(${this.age}).`)
    }
    moreInfo(){
        console.log(`${super.info()}, ${this.sex}`); //super.info() => Mazey.info.call(this)
    }
}
var c1 = new Cherrie('cherrie', 17, 'girl');
c1.say(); //My name is cherrie, i'm 17. I am a girl(17).
c1.moreInfo(); //cherrie, 17, girl

七、通过函数实例类/2017-08-10

可传入任意组{key: value}对象,只取需要的值,没有则使用默认值。

//定义类
function Person(obj) {
    this.name = obj.name || 'anonymous';
    this.age = obj.age || 0;
}
//定义类共享内存的方法
Person.prototype.say = function () {
    console.log(`My name is ${this.name}, i'm ${this.age}.`);
};
//通过函数创建实例
function newPerson (obj) {
    return new Person(obj || {});
}
//正常传值
var mazey = newPerson({ //自动获取name和age
    name: 'mazeyqian',
    age: '19'
});
mazey.say(); //My name is mazeyqian, i'm 19.
//只传一个
var cherrie = newPerson({
    name: 'cherrie'
});
cherrie.say(); //My name is cherrie, i'm 0.
//不传值
var someone = newPerson(); //若不传值,则使用默认值
someone.say(); //My name is anonymous, i'm 0.
//传不相关值
var test = newPerson({
    sex: 'boy'
});
test.say(); //My name is anonymous, i'm 0.