js原型和原型链理解 constructor 构造函数

一.对象:普通对象   函数对象函数

二.构造函数特色:1.须要new实例化,内部使用this对象指向即将要生成的实例对象  2.首字母大写,用于区分普通函数this

function Person(name){
    this.name=name
}
var person1=new Person('xiaohong')
var person2=new Person('lili')

person1.constructor=Person   constructor指向构造函数,Person的内置属性 Person.prototype(函数对象),每一个原型对象都有一个constructor属性,指向prototype属性所在的函数Personspa

即person1.constructor=person2.constructor=Person.prototype.constructorprototype

经过原型实现继承code

三.__proto__,每一个对象都有这个属性指向建立他的构造函数的原型即person1.__proto__=Person.prototype对象

//var obj={}
var obj=new Object();
obj.constructor===Object
obj.__proto__===Object.prototype

person1.__proto__是Person.prototypeblog

Person.__proto__是Person是构造函数,Function,即Function.prototype继承

Person.prototype._proto__是  Person.prototype是原型对象,Object,即Object.prototype原型链

Object.__proto__是 Objext是构造行数Function 即Function.prototypeget

Object.prototype.__ptoto__是 Object.prototype的原型对象的__proto__指向构造函数的prototype,处于顶层是null

四。Math和Json是以对象存在的 即Math.__proto__===Object.prototype

五。Function.prototype是惟一一个typeof Function.prototype是function的prototype,其余构造器的prototype都是object

六。注意constructor的指向例如

function Animal(){

}
Animal.prototype.age='20'

function Cat(name,color){
    this.name = name
    this.color = color
    this.name2 = '11112222'
}
Cat.prototype = new Animal();
Cat.prototype.type="猫"
Cat.prototype.eat=function(){
    console.log('爱吃鱼')
}
function Dog(name){
    this.name=name
}
Dog.prototype = new Animal();
Dog.prototype={
    getName:function(){
        console.log('gougou')
    }
}

Cat.prototype.constructor === Animal   Dog.prototype.constructor===Object 二者不相同,后者是重写Animal.prototype,前者是修改。

七。

  • 原型和原型链是JS实现继承的一种模型。
  • 原型链的造成是真正是靠__proto__ 而非prototype