传统构造函数的问题
function Foo() {
this.sHello = function (){
}
}
- 由于对象是调用
new Foo()
所创建出来的,因此每一个对象在 创建的时候,函数sHello 都会被创建一次 - 那么每个对象都含有一个独立的,不同的,但是功能逻辑一样的函数, 比如:
{} == {}
- 在代码中方法就会消耗性能,最典型的资源就是内存.
- 这里最好的办法就是将函数体放在构造函数之外,那么在构造函数中 只需要引用该函数即可
function sHello (){}
function Foo(){
this.s = sHello;
}
会在发开中变得困难:引入框架危险,代码繁冗不好维护,解决办法 就是外面的函数如果不占用名字,而且在函数旗下就好了。
每一个函数在定义的时候,有一个神秘对象创建出来,
- 每一个由构造函数创建的对象都会默认的链接到该神秘对象上。
var f1 = new Foo();
var f2 = new Foo();
f1.sHello();//如果f1没有sHello,那么就会在Foo。prototype中去找
f2.sHello();//如果f2没有sHello,那么就会在Foo。prototype中去找
- 由构造函数创建出来的众多对象共享一个对象,就是构造函数 .prototype
- 只需要将共享的东西,重复会多占用内存的东西放到构造函数 .prototype 中,
那么所有的对象
function Foo() {}
Foo.prototype.sHello = function (){
console.log('...');
};
var f1 = new Foo();
f1.sHello();
var f2 = new Foo();
f2.sHello();
console.log( f1.sHello === f2.sHello ); //true
练习:
function Student (name, age, gender){
this.name = name;
this.age = age;
this.gender = gender;
}
Student.prototype.sHello = function(){
console.log('你好');
};
Student.prototype.study = function(){
console.log('学习');
}
常见错误
- 写构造函数.prototupe 的时候,将属性也加到里面。
function Person() {}
Person.prototupe.name = '张三';
var p = new Person();
//name是死的无法改变的。
//有一个函数创建出来的对象都需要初始化这个属性时,时对的。
//数组初始化的时候都是空数组;
- 赋值的错误
function Person() {}
Person.prototupe.name = '张三';
var p1 = new Person();
var p2 = new Person();
p1.name = '李四';
console.log(p1.name);
console.log(p2.name);
//如果是访问数据,当前对象中如果没有该数据就到构造函数的原型属性中去找
//如果是写数据,当对象中有该数据的时候,就是修改值; 如果对象没有该数据,那么就添加值。