prototype与 _proto__的关系

prototype与 __ proto__ 都是在这个过程当中催生的产物,咱们一下子立刻讨论,在这之...作对象便可,那javascript种到底是经过什么来明确继承关系的呢。javascript

 

1、构造函数:html

构造函数:经过new关键字能够用来建立特定类型的对象的函数。好比像Object和Array,二者属于内置的原生的构造函数,在运行时会自动的出如今执行环境中,能够直接使用。以下:java

var arr = new Array();//使用Array构造函数建立了一个array实例arr
arr[0]="a";
arr[1]="b";
alert(arr);//a,b
var obj=new Object();//使用Object构造函数建立了一个Object实例obj
obj.name="c";
obj.age=12;
alert(obj.name);//c

咱们能够自定义的建立构造函数,并为其自定义属性和方法,如:浏览器

//建立构造函数Person
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name)//
};
}
//使用new关键字,来生成Person实例
var person1=new Person("Tom",22);
var person2=new Person("Jerry",21);
person1.sayName();//Tom
person2.sayName();//Jerry

注意如下几点:函数

  • 构造函数的名字始终要以大写字母开头(主要是为了区别于非构造函数,也便是区别于普通函数)
  • 构造函数也就是函数,定义构造函数和定义普通函数的语法同样。构造函数和普通函数的区别在于:使用他们的方式不一样。任何函数只要使用new操做符来调用,那他就能够做为构造函数;不使用new操做符来调用就是普通函数
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name)//
};
}
//当作构造函数使用
var person=new Person("Tom",22);
person.sayName();//Tom
//当作普通函数使用
Person("Jerry",30);//添加到window
sayName();//Jerry 等同于window.sayName();

2、原型对象:post

每一个函数都有一个prototype属性,它是一个指向原型对象的指针,原型对象在定义函数时同时被建立,原型对象的用途是包含全部实例共享的属性和方法this

function Person(){
}
//自定义原型对象的属性和方法
Person.prototype.name="Tom";
Person.prototype.age=25;
Person.prototype.sayName=function(){
alert(this.name);
};
//原型对象中的全部属性和方法 都会自动被全部实例所共享
var person1=new Person();
var person2=new Person();
person1.sayName();//Tom
person2.sayName();//Tom

只要建立了一个新函数,每一个函数在建立以后都会得到一个prototype的属性,这个属性指向函数的原型对象(原型对象在定义函数时同时被建立),此原型对象又有一个名为“constructor”的属性,反过来指向函数自己,达到一种循环指向,prototype

如在上边的例子中:alert(Person.prototype.constructor===Person);//会返回true指针

function Person(){}
alert(Person.prototype.constructor===Person);//true

3、proto(注意这里proto左右两边都有两个"_")htm

当调用构造函数建立一个新实例后,该实例的内部将包含一个指针[[Prototype]],该指针指向建立它的构造函数的原型,在脚本上没有标准的方法来访问[[Prototype]],但大多数浏览器都支持经过proto来访问。

function Person(){
}
//自定义原型对象的属性和方法
Person.prototype.name="Tom";
Person.prototype.age=25;
Person.prototype.sayName=function(){
alert(this.name);
};
//原型对象中的全部属性和方法 都会自动被全部实例所共享
var person1=new Person();
var person2=new Person();
person1.sayName();//Tom
person2.sayName();//Tom
alert(person1.__proto__===Person.prototype);//true

 

揭秘Javascript中prototype与 _proto__的关系

 

总结:

①只要建立了一个函数,该函数的原型对象也随之同时被建立出来,原型对象中的属性和方法被经由其相对应的构造函数所建立的实例所共享

②每一个函数在建立以后都会得到一个prototype的属性,这个属性指向该函数的原型对象

③每一个对象的proto属性都指向其构造函数的原型

 

出处:http://www.javashuo.com/article/p-ufkrsupk-br.html

相关文章
相关标签/搜索