前端--精神氮泵(二) ---原型

对于原型,有一篇很好的文章:(https://blog.csdn.net/weixin_38654336/article/details/83050165)
https://blog.csdn.net/u012468376/article/details/53121081

原型是js中继承的基础,这里有几个要知道的。
1.每个对象都有一个constructor属性指向它的构造函数。
2.每个对象都有一个__proto__ 属性指向它的原型。
3.实例对象中的prototype属性不可直接访问。

好了,开始:
我们每声明一个构造函数

function Person(){
				this.age=20;
				this.name="张三";
			 }

浏览器就会创建一个对象,这就是原型对象,原型对象存储在内存中了。这个原型对象就是以后实例对象的基类。

var person1=new Person();
			 console.log(person1.age);//20

这里new了一个对象,对于查找person1的属性,如果有它自己的属性就会先用它自己的属性,如果没有找到,就会到他的原型对象中找,这里的age就在原型对象中找到。

下面说说几个点,原型的全面了解建议看上面的连接
1.(上面文章的原话)
我们根据需要,可以Person.prototype 属性指定新的对象,来作为Person的原型对象。

但是这个时候有个问题,新的对象的constructor属性则不再指向Person构造函数了。

<script type="text/javascript">
	function Person () {
		
	}
	//直接给Person的原型指定对象字面量。则这个对象的constructor属性不再指向Person函数
	Person.prototype = {
		name:"志玲",
		age:20
	};
	var p1 = new Person();
	alert(p1.name);  // 志玲

	alert(p1 instanceof Person); // true
	alert(Person.prototype.constructor === Person); //false
  	//如果constructor对你很重要,你应该在Person.prototype中添加一行这样的代码:
  	/*
  	Person.prototype = {
      	constructor : Person	//让constructor重新指向Person函数
  	}
  	*/
</script>

在构造中的方法,实例的对象都是各自独占一份的。

function Person(){
				this.age=20;
				this.name="张三";
				this.eat=function(){
					console.log("吃东西");
				}
			 }
			 var person1=new Person();
			 var person2=new Person();
			 console.log(person1.eat===person2.eat) //false

但是可以在原型对象中实现函数的共享

function Person(){
				this.age=20;
				this.name="张三";
			 }
			 Person.prototype.eat = function () {
			 		alert("吃");
			 	}
			 var person1=new Person();
			 var person2=new Person();
			 console.log(person1.eat===person2.eat) //true

顺便提一下,在js中,即使两个对象的属性和函数都相等,js也不会判断他们两个相等

3.对于
person1.__proto__是 Person.prototype
Person.__proto__是Function.prototype 的解释
1、首选__proto__是浏览器厂商实现的,W3C规范中并没有这个东西。
2、它的作用就是访问对象的原型。
3、对于js来说,一切皆对象,尤其是引用类型,更是如此。
4、所有的对象都有一个原型(null除外),函数是对象,那么函数也不例外。所以Person.__proto__就是访问这个构造函数的原型。
5、每一个函数都有一个prototype属性,属性的值也是一个对象,称为原型对象。所以Person.prototype访问的就是这个Person类的原型对象。
6、抛开__proto__来说,通过属性访问Person的原型可以这样写:Person.constructor.prototype。也就是说
Person.contractor.prototype === Person.proto //true;
7、假如实例化Person,var p = new Person();综上所述,
p.constructor === Person // true;
p.constructor.prototype === Person.prototype // true;
不知道这样解释能理解嘛。(大佬的原话…)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值