var o1 = {}; var o2 = new Object(); var o3 = new f1(); function f1(){}; var f2 = function(){}; var f3 = new Function('str'); typeof Object;//function typeof Function;//function typeof f1;//function typeof f2;//function typeof f3;//function typeof o1;//object typeof o2;//object typeof o3;//object
在上面的例子中 o1 o2 o3 为普通对象,f1 f2 f3 为函数对象。怎么区分,其实很简单,凡是经过 new Function() 建立的对象都是函数对象,其余的都是普通对象。f1,f2,归根结底都是经过 new Function()的方式进行建立的。Function Object 也都是经过 New Function()建立的。函数
function Person(name, age, job){ this.name = name; this.age = age; this.sayName = function(){ alert(this.name); } } var person1 = new Person('mike',15); var person2 = new Person('nike',18);
上例中person1和person2为Person的实例,两个实例中都有隐含的
==constructor==属性(经过原型对象继承获得),该属性指向构造函数Personthis
function Person(name, age, job){ Person.prototpe.name = father; Person.prototpe. = 28; Person.prototpe.sayName = function(){ alert(this.name); } } var person1 = new Person(); person1.sayName();//'mike' var person2 = new Person(); person2.sayName();//'nike' person1.sayName == person2.sayName;//true person1.name = 'joy'; person1.sayName();//'joy'
经过为构造函数Person的原型对象建立属性,person1,person2将继承Person.prototype的属性,若是实例定义了与原型对象同名属性,原型对象属性则会被覆盖。prototype
function Person(){} Person.prototype = { name:'', age:'', sayName:function(){ } }
==注意==:该方法的原型对象的constructor属性再也不指向Person,此时例中指向Object(新new的一个对象),如若须要可在Person.pertotype的字面量中添加:==constructor:Person,==设计
JS 在建立对象(不管是普通对象仍是函数对象)的时候,都有一个叫作__proto__ 的内置属性,用于指向建立它的构造函数的原型对象。code
函数对象的__proto__所有都是指向Function的prototype。对象
对象 person1 有一个 __proto__属性,建立它的构造函数是 Person,构造函数的原型对象是 Person.prototype ,因此:
==person1.__proto__ == Person.prototype==blog
不过,要明确的真正重要的一点就是,这个链接存在于实例==person1==与构造函数==Person==的原型对象==Person.prototype==之间,而不是存在于实例person1与构造函数Person之间。继承
js高级程序设计图
ip
当咱们建立一个函数时:
var Person = new Object()
Person 是 Object 的实例,因此 Person 继承了Object 的原型对象Object.prototype上全部的方法:
原型链
获取对象的原型
对象经过__proto__属性访问原型,构造函数经过prototype属性访问原型
函数的 prototype 是一个对象,也就是原型
对象的 proto 指向原型, proto 将对象和原型链接起来组成了原型链