js中的创建对象方法原型模式和构造函数模式区别

第一次用这个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的动态原型模式

参考资料: https://segmentfault.com/a/1190000013610498

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值