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();

浙公网安备 33010602011771号