原型链-私有属性-原型重构-instanceof

230 阅读2分钟

原型图

对于原型图 我们三句话

  • 每一个函数(类)都有一个默认的prototype 属性,指向自己的原型对象
  • 每一个实例(对象)都有一个__proto__属性,指向所属类的原型对象
  • 每一个默认的原型对象上都有一个constructor属性 指向对应的函数构造本身

普通函数的执行过程

开辟一个作用域---->形参赋值---->变量提升----->代码从上到下执行;

new 函数执行

开辟一个作用域---->形参赋值---->变量提升---->开辟一个堆内存,把this的指向改成堆内存---->然后代码从上到下执行---->默认return为this

私有属性

`in 是用来查看 某个属性 是否属于莫格对象,换句话说 就是 该对象是否可以调到该对象`
  in 只能判断出某个属性 是不是属于某个对象;但是不能区别出是否是他的私有属性。
`obj.hasOwnProperty('xxx') 这个属性可以用来查看'xxx' 是否是  obj 的私有属性  `
 hasOwnproperty 方法在基类的原型上,所有任何数据类型(除去null、undefined) 都可以调到该方法

 //自己封装一个hasPubPropety //用来查看某个属性是否是某个对象的共有属性;
 // 用法等于用hasOwnProperty
   var obj={};
   obj.__proto__.hasPubProperty= function (n){
      return   (n in this && !this.hasOwnProperty(n) ? true : false)
   }
obj.hasPubProperty("aaada")

原型重构 (注意 constructor 的指向)

   function Person(name,age) {
        this.name = name;
        this.age = age;
    }
    Person.prototype.eat = function(){}

    var obj = {
        constructor:Person,
        eat(){},
        play(){}
    }
    Person.prototype = obj

xxx instanceof xx2 ;查看xxx 到基类的原型链上 是否存在xxx2的身影

  var ary = [];
    var n = 10;
    var m = new Number(10);
    console.log(ary instanceof Array) // true
    console.log(ary instanceof Object) // true
    console.log(ary instanceof Number) // false
    console.log(n instanceof Number) // false
    console.log(m instanceof Number) // true

 存在结果就是true 不存在 结果就是false
 值类型的数据 instanceof 谁 都是false`