欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-23 23:14:37
...

使用对象字面量作为其他对象的基础
创建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》(第二版) 第三章

相关标签: Object.create()