第一次用这个markdown编辑器,感觉挺难用的
构造函数模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
}
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
原型模式
function Person(){
Person.prototype.name = 'Nicholas';
Person.prototype.age = 29;
Person.prototype.job = 'Software Engineer';
Person.prototype.sayName = function(){
alert(this.name);
}
}
var person1 = new Person();
person1.sayName();//"Nicholas";
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName);
这个this和prototype有什么区别
通过this相当于每次通过new创建一个对象,都会给实例创建对应的属性,包括函数
通过prototype创建对象,每个实例都会有_proto_属性,这个属性就是继承自类的prototype定义的属性,相当于保存的只是一个指针
对于一个对象,比如人,他们有各自的名字、年龄、工作,但是像sayName这种没有必要重复创建
于是有了动态原型模式
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
if (typeof this.sayName != "function") {
Person.prototype.sayName = function(){
alert(this.name);
}
}
}
这样,每个创建出来的实例都是有各自的name,age,job,但是他们的sayName函数就是原型上的(共享的),资源使用更合理
再到ES6的类
class Person {
constuctor(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
}
sayName() {
alert(this.name)
}
}
var p = new Person('OlyLis', 24, 'FE');
console.log(!!p.__proto__.sayName); // true
是不是跟动态原型模式很相似呢
这么看来,es6的类就是es5的动态原型模式