我对js原型和原型链的用法

优点
1.数据共享 节约内存内存空间
2.实现继承

我们知道在js中,万物皆对象,对象可以说是重中之重了。每一个对象都拥有自己的属性。但是在这个世界中有很多东西都是相似的,可以归为一类,他们有共同的方法和属性。不可能让每一个对象都定义一个属性吧。那样太消耗内存了。所以,在js中怎么才能让多个对象共享一个或多个方法呢?原型的出现就是为了解决这个问题。

在js中每个对象都有一个与它关联的对象,叫做原型对象(可以理解为兄弟对象,他们两个有一定的关系)。每一次获取对象属性都是一次查询过程,当在对象的自有属性中找不到时就会去查找它的原型对象。

在js中函数也是一个对象。每个函数都有一个prototype属性(只有函数才有prototype属性),这是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。按照字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。其中原型对象会自动获得一个constructor属性,这个属性指向原来的构造函数。如下面的Man.prototype.constructor指向Man。


function Man(name,age) {
	this.name = name;
	this.age = age;
}
 
function test() {
	var person1 = new Man("张三","18");
	var person2 = new Man("李四","19");
	Man.prototype.sex = "男";
	console.log(person1.sex); //男
	console.log(person2.sex); //男
}

每个男孩共有的属性就是他的性别都是男,所以我们可以将此属性添加到实例的原型对象中去。这样每个实例都可以共享这个属性。

我们前面说了每个函数都有prototype属性,指向函数的原型对象。他的实例对象可以共享这个属性,那我们怎么将实例对象和原型对象关联起来呢?在js中,任何对象都有一个属性叫__proto__([[prototype]]),它也是一个指针,指向构造函数的原型对象,就是我们所能共享信息的那个对象

我们不同的对象可能会用到不同的属性,比如说一个对象需要一种属性,一个对象需要另一种属性。这时如果我们把它都定义在一个原型对象中肯定是不好的,这时我们就需要java中常说的继承。js中实现继承的方式是通过原型链。

原型链是什么呢,根据字面意思我们可以这样理解,就是将原型连成一条链。我们上面讲过,js每一次获取对象中的属性都是一次查询过程,如果在自有属性中找不到就会去原型对象中查找,如果原型对象中还查不到,就回去原型对象的原型中查找,也就是按照原型链查找,直到查找到原型链的顶端,也就是Object的原型。

function FutherType(){
	this.property = true;
}
 
FutherType.prototype.getFutherValue = function(){
	return this.property;
}
 
function SonType(){
	this.sonproperty = false;
}
 
SonType.prototype = new FutherType();
 
SonType.prototype.getSonValue = function(){
	return this.sonproperty;
}
 
var instance = new SonType();
console.log(instance.getFutherValue()); //true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值