原型,原型链,call/apply(上)

原型,原型链,call/apply

     定义:原型是function对象的一个属性,他定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。      原型也是对象。

     利用原型特点和概念,可以提取共有属性。

     对象如何查看原型à隐式属性_proto_

     对象如何查看对象的构造函数àconstructor

            //Person .prototype   ---原型
			//Person.prototype = {}   是祖先
			Person.prototype.name = "haha";//祖先
			function Person(){
				
			}
			var person = new Person();//继承祖先

            Person.prototype.Lastname = "haha";
			Person.prototype.say = function (){
				console.log("hehe");
			}
			function Person(){
				
			}
			var person = new Person();
			var person1 = new Person();

            Person.prototype.Lastname = "haha";
			Person.prototype.say = function (){
				console.log("hehe");
			}
			function Person(){
				this.Lastname = "ji";
			}
			var person = new Person();
			var person1 = new Person();

自己身上有属性,原型上也有,可近的来。

            Person.prototype.Lastname = "li";
			Person.prototype.say = function (){
				console.log("hehe");
			}
			function Person(name,age,sex){
				this.name = name;
				this.age = age;
				this.sex = sex;
			}
			var person = new Person("ming",18,"male");

通过构造函数流程化生产,把这个对象生产出来了,生产出来之后这个对象有三个属性,对象有自己的属性,对象也有继承来的属性,访问自己的属性——person.name,访问他没有的属性——person.Lastname,相当于访问自己的属性一样。

            function Car(color,owner){
				this.owner = owner;
				this.carName = "BMW";
				this.height = 1400;
				this.lang = 4900;
				this.color = color;
			}
			var car = new Car('red',"prof.ji");

可以选配的我写到里面,可以流程化生产的我也写到里面,理论上看来没问题,但现在选配的这么来写没问题,里面这种流程化生产的(this.carName "BMW";this.height = 1400;this.lang = 4900;)每一次执行,都得执行这东西,这是不是叫代码的耦合啊,那咱能不能通过原型把它提取出来。

            Car.prototype.height = 1400;
			Car.prototype.lang = 4900;
			Car.prototype.carName = "BMW"//给原型赋值的只执行了一遍
			/*Person.prototype = {
				height : 1400;
				lang : 4900;
				carName : "BMW";//更简化*/
			}
			function Car(color,owner){
				this.owner = owner;
				this.color = color;
			}
			var car = new Car('red',"prof.ji");
			var car1 = new Car('green',"li");

看起来car和car1有了属性是这样的,但是要真正访问要用的话,,是不是也有,继承来的。

改:

            Person.prototype.lastName = "li";
			function Person(name){
				this.name = name;
			}
			var person = new Person("ming");

他自己身上多了一个lastname,并不是改的原型的。

原型,你想修改他的属性,除非你调用Person.prototype.lastName,否则通过对象想改原型,基本上是不可能的。

增:能不能的给原型增加属性?除非你用Person.prototype来增加属性,改都不可能,增就别提了。

删:这是咋回事?true是哪来的?

person有abc吗,你删除一个她没有的属性,他觉得可以啊。

电脑也不是白痴啊。

            function Car(){
				
			}
			var car = new Car();

prototype上来她本来就有,我们只不过是在她身加了一些东西,那我现在想看看你这个prototype到底有什么东西,是不是一个纯的空对象。

,constructor是构造器的意思,他会返回这个构造对象的构造函数,

            function Person(){
			 	
			 }
			Car.prototype = {
				constructor : Person//原来的Car,他会变吗?
			}
			function Car(){
				
			}
			var car = new Car();

变成Person了吧,所以说这个constructor是我们可以手动更改的,虽说的系统给的。

 

猜你喜欢

转载自blog.csdn.net/hdq1745/article/details/81779255