原生JS以对象作为构造器创建实例Object.create()

使用对象字面量作为其他对象的基础
创建Person对象 具有下列属性

var Person = {
    firstName : 'quanquan',
    lastName : 'xu',
    birthDate : new Date('1992-01-04'),
    gender : 'female',
    getAge : function(){
        var today = new Date();
        var diff = today.getTime() - this.birthDate.getTime();
        console.log( diff )
        var year = 1000*60*60*24*365.25;
        return Math.floor(diff/year);
    },
    toString : function(){
        return this.firstName + ' ' + this.lastName + ' is a ' + this.getAge() + ' year-old ' + this.gender;
    }
 }

创建Person的类型的实例
ES6 Object.create 提供对象间联系的方法
修改原型中的一些属性 未修改的则继承Person

var yuan = Object.create( Person );

 console.log( yuan.__proto__ );//查看yuan的原型Person
 console.log( yuan.__proto__ === Person);//true

 yuan.firstName = 'yuanyuan';//修改firstName
 yuan.lastName = 'hu';//修改lastName
 yuan.birthDate = new Date('1990-10-25');//修改birthDate

 console.log( yuan.toString() );//yuanyuan hu is a 27 year-old female

当ES6 不支持Object.create时可以使用一下方法创建实例
构造函数的方式

if( typeof Object.create != 'function' ){
    Object.create = function( o ){
        function F(){}
        F.prototype = o;
        return new F();
    }
 }

当你不喜欢使用Object.create时 可以使用工厂方法

var Animal = {
    type : 'pig',
    age : '3',
    gender : 'female',
    showInfo : function(){
        return this.type + ' ' + this.age + this.gender;
    },
    extend : function(config){
        var tmp = Object.create( this );
        for( var key in config ){
            if( config.hasOwnProperty( key ) ){
                tmp[ key ] = config[ key ];
            }

        }
        return tmp;
    }

 }
 //dog继承Animal
 var Dog = Animal.extend({
    type : 'dog',
    age : '4',
    showInfo : function(){
        return 'this dog' + this.type + this.age;
    }
 });
 //cat继承Dog 但拥有Animal的属性
 //如果Dog的属性与Animal的属性冲突 那么继承的是Dog的属性
 var cat = Dog.extend({
    type : 'cat',
    age : '5'
 });
 console.log(Dog.showInfo());//this dogdog4
 console.log(cat.__proto__);//Dog
 console.log(Dog.__proto__);//Animal
 console.log( cat.showInfo() );//this dogcat5

判断Dog的原型是否是Animal isPrototypeOf

 console.log( Animal.isPrototypeOf( Dog ) );//true
 console.log( Dog.isPrototypeOf( Animal ) );//false

返回当前对象的原型 getPrototypeOf

console.log( Object.getPrototypeOf(cat) );//Animal

参考书籍:《精通javascript》(第二版) 第三章

你可能感兴趣的:(原生JS以对象作为构造器创建实例Object.create())