js创建对象

    //构造函数(普通函数,被new 实例化了)
    function Person(n, a){
        this.name = n;
        this.age = a;
        this.say = function(){
            console.log('我叫' + this.name);
        }
    }

    var person1 = new Person('张三',30);//实例化
    var person2 = new Person('李四',40);//实例化
    console.log(person1.name,person1.age);
    console.log(person2.name,person2.age);

构造函数创建对象:里面方法,每次实例化都是重新定义一个function,浪费内存

解决内存浪费问题,将构造函数中的方法,单独放在外面定义 如下:

var fn = function(){
        console.log('我叫' + this.name);
    };
    function Person(n, a){
        this.name = n;
        this.age = a;
        this.say = fn;
    }
    var person1 = new Person('张三', 30);
    var person2 = new Person('李四', 40);

 

解决命名问题: 方法非常多时,取名是个问题,容易和一些全局变量冲突
解决方法: 定义一个公共的字面量对象,存放某类的所有对象公共的方法

    var obj = {
        "fn":function(){
            console.log('我叫' + this.name);
        },
        "fn2":function(){
            console.log('我走的很快');
        }
    };
    //构造函数中,给每个人直接定义方法(从公共对象中取)
    function Person(n, a){
        this.name = n;
        this.age = a;
        this.say = obj.fn;
        this.walk = obj.fn2;
    }
//另一类(动物)的对象
    var obj2 = {
        "fn":function(){
            console.log('我叫' + this.name);
        },
        "fn2":function(){
            console.log('我叫' + this.name);
        }
    };
    function Dongwu(){
        this.name = n;
        this.age = a;
        this.say = obj2.fn;
    }

 

以上写起来还是麻烦,下面使用 构造函数 和 原型对象 混合定义方式:

    //将属性定义在构造函数中,将方法定义到原型对象中
    function Person(n,a){
        this.name = n;
        this.age = a;
    }
    //js给每一个构造函数,都自动分配了一个公共的对象,用来存放这个构造函数实例化后的所有实例对象 公共的成员,这个公共对象就叫做原型对象,可以通过构造函数的prototype属性取到
    // console.log(Person.prototype);
    Person.prototype.say = function(){
        console.log('我叫' + this.name + ',我今年' + this.age + '岁');
    }
    Person.prototype.walk = function(m, n){
        console.log('我走的很快');
        // return m+n;
    }
    //多次实例化构造函数,得到多个对象
    var person1 = new Person('张飞', 30);
    var person2 = new Person('刘备', 40);
    //Person构造函数的每一个实例对象,都可以直接使用对应的原型对象上的方法
    person1.say();
    person1.walk(1,2);
    person2.say();

 

posted @ 2021-02-21 21:48  华北业余选手  阅读(323)  评论(0)    收藏  举报