原型链 私有属性

746 阅读3分钟

原型链 原型图

对于原型图 有三句话
    每一个函数(每个类)都有一个 默认的 prototype 属性 指向自己的原型对象
    每一个实例(对象) 都有一个 _proto_ 的属性 指向所属类的原型对象
    每一个 默认的 原型对象  上 都有一个 constructor 属性 指向 对应的 构造函数本身
    如果默认的原型对象 被改变了地址,又没有加这个constructor属性,那么更改的原型对象是没有constructor这个属性的

    每个类都是函数
    
var f = () =>{ console.log(1) };
console.dir(f);//本身箭头函数 没法用构造函数方式去创造实例,所以箭头函数里没有默认的 prototype

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

var p1 = new Person('xiaoming', 12);
var p2 = Person('xiaohong', 13);
//普通函数执行的过程:开辟一个作用域,形参赋值,变量提升 代码从上到下执行
//new 执行时,开辟一个作用域,形参赋值,变量提升  开辟一个堆内存 把this指向改成这个堆内存 然后代码从上到下执行

私有属性

    // in 是用来查看  某个属性  是否属于某个对象;换句话说,就是该对象是否能调用到该属性,就算属性是其类的原型里的属性,也是可以的
   //所以 in 不能判断出这个属性是否是自己私有的  
   // obj.hasOwnProperty('xxx')  这个属性可以用来查看 xxx 是否是obj的私有属性
   //hasOwnProperty 是Object 这个基类原型上的方法,所以 任何数据类型(除了null undefined)都可以用这个方法,都可以调用

var ary = [1,2,3];
   ary.qqq = 123;
   for (var k in ary) {
       console.log(typeof k);
       console.log(ary[k]);//这里,能够把ary这个数组的属性qqq的值输出,不符合我们的需求,我们是只想输出 里面的项  所以一般 数组不用 for in 循环
   }

//自己封装一个 hasPubProperty  用来查看某个属性是否是某个对象的共有属性
   //用法等同于 has OwnProperty 

//    function hasPubProperty (m) {
//        (this.hasOwnProperty('m'))?false:true
//    }
//    Object.prototype.hasPubProperty = hasPubPorperty;

   Object.prototype.hasPubProperty = function (key) {
       // this是我们要用的obj;
       //要去判断 key 是不是 this 的一个共有属性;
       //首先 是它的属性 然后 不是它的私有属性
       return (key in this && !this.hasOwnProperty(key))
   }

constructor instanceof

//为什么用constructor能查询数据类型?因为数据所属类的原型里有constructor这个属性,指向的是类,所以这个的机制是基于原型图的
var n = 22;
n.constructor;// 就是去看它的所属类

//原型重构
function Person (name, age) {
    this.name = name;
    this.age = age;
}
var obj = {
    constructor:Person,
    eat () {},
}
Person.prototype = obj//原型重构 就是直接把原型改了,要注意的就是把constructor补全,因为默认的prototype 是有constructor的

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

//xxx instanceof YYY   :查看xxx到 基类的原型链上是否存在 YYY的身影 
//存在 ,结果就是 true  ;不存在,结果就是false
//基本数据类型  instanceof 谁  ;都会是 false