原生js底层基础(八)JavaScript 原型(prototype)、原型链、构造器

1.原型(prototype)

1)概念

在Javascript中,当系统加载构造函数后,会自动在内存中生成一个对象,这个对象就是原型对象。两者之间在内存中表现为相对独立,不存在谁包含谁的关系。但是两者之间又有一些关联,在构造函数的内部存在一个prototype属性指向原型对象,同时在原型对象的内存也存在一个属性constructor其指向了构造函数。简而言之,原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。

2)作用

利用原型特点 提取共有属性

//Car.prototype.name= "BWM"; //把公有的属性放到原型里
//Car.prototype.width=1900;
//Car.prototype.height = 100;
//由于原型也是个对象,所以还能这么写,与上三句等同
Car.prototype = {
	name : "BWM",
	width : 1900,
	height :100
}

function Car(owner,color){
	this.owner = owner;
	this.color = color;
}

var car= new Car("zhangsan","red");
var car2= new Car("lisi","black");
car.name;
car2.name;
3) 对象查看原型和构造器
function Person( ){	
} 
var p = new Person( );

var p = new Person( );这句当运行到的时候会在Person里隐式写上var this = {prop:Person.prototype}, 即p. __ prop __ =Person.prototype

p
Person {}
__proto__:
	constructor: ƒ Person( )
	__proto__: Object

设置Person的原型的属性name

Person.prototype.name = "abc";

再在控制台输入p

p	
Person {}
__proto__:
	name: "abc"					//Person.prototype.name
	constructor: ƒ Person( )	//构造器
	__proto__: Object	

相当于__proto__ == Person.prototype,是通过proto才找到Person.prototype的

2)手动修改构造器
function Car(){
} 
var car  = new Car( );

function  Person(){

}
var person = new Person();
Person.prototype = {
	constructor : car
}
Person.prototype.constructor	   //返回Car {}

2.原型链

1)原型链的形成

Grand.prototype.lastName="liming";
function Grand(){
	this.money={            //方法里的对象都要用this
	gold:1000
	
   }
}
var grand = new Grand();
Farther.prototype = grand;
function Farther(){
	this.name="xuming",
	this.fortune={
		card:'visa'
	}
	this.num=100
	
}
var farther = new Farther();
Son.prototype = farther;
function Son (){
	this.hobbit = "smoke"
}
var son = new Son();


2)原型链的增删查改

子孙不能删掉、修改父(原型)的对象值等,但是可以增加父(原型
)对象集合里的属性值,

栗子1:

son.num++;
son
-->Son {hobbit: "smoke", num: 101}//把son.num引用取过来再+1
farther
-->Grand {name: "xuming", fortune: {}, num: 100}//原型的num不变

例如以下 其实是先调用son.money这个引用 再给它增加属性,这不是一种赋值的修改,是一种调用的修改 是可以的

son.money.silver="2000"
son.money
-->{gold: 1000, silver: "2000"}//返回新增的属性

对它原型的原型grand来说,自己的对象及属性也变了

grand.money.gold
-->1000

如果改的是son.money = “5000”,那么就是给自己添加属性,不回去修改原型的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值