原型链模式

在类的原型链(prototype)上定义公有的属性

  function Fn() {
        this.a = function () {
            console.log("a");
        }
        this.c = function () {
            console.log(this);
        }
    }
    Fn.prototype.b = function () {
        console.log("b");
    }
    Fn.prototype.c = function () {
        console.log(this);
    }
    var f1 = new Fn;
    var f2 = new Fn;
   console.log(f1.a == f2.a);//false  a是私有的属性
   console.log(f1.b == f2.b);//true b是公有的属性

查找的机制:首先在自己私有的属性上找,有的话就是私有的;没有的话,通过__proto__找到所属类的prototype上(这个是公有的),如果有就是公有的属性;如果还没有,在通过所属类的prototype上的__proto__找到Object基类的prototype上,如果还没有就报错了!

 

console.log(f1.a == f2.a);//false a是私有的属性
console.log(f1.b == f2.b);//true b是公有的属性
f1.a();
f1.b();
f1.hasOwnProperty();
f1.a == f2.a;//false
f1.b == f2.b;//true
f1.__proto__.b==f2.__proto__.b;//true
f1.c==f2.c;//false
f1.__proto__.c==f2.__proto__.c;//true
f1.b==Fn.prototype.b;//true
f1.__proto__==Fn.prototype; //true
f1.__proto__.b==Fn.__proto__.b;//false
f1.__proto__.b===Fn.prototype.b//true--
console.log(f1.__proto__.b==Fn.__proto__.b);false

原型模式中的新增加属性
f1.d=function(){}//给f1新增加一个私有的属性d
f2.d(); //f1增加的私有属性 f2并没有
f1.__proto__.m=function(){}//在f1所属类的原型上增加一个公有的属性m
f2.m(); //f1往公有里面增加的属性 f2也能用

console.log(f1.__proto__.__proto__.hasOwnProperty("c"));//false
当前hasOwnProperty方法中的this是Object.prototype,
而hasOwnProperty中查找的是当前this里面是否有"c",而Object.prototype没有c,所以是false


用constructor来检测数据类型:
var ary=[];
console.log(ary.constructor==Array);//true

 

1、 类(Fn)是一个函数数据类型,在js中函数既是函数数据类型也是对象数据类型
function f() {}
说它是函数数据类型,因为它可以执行:f() 而且形成私有的作用域、arguments、return、形参...
说它是对象数据类型,因为它可以像我们的对象一样增加属性名和属性值,
例如:f.WXJ= "hello word";console.log(f.WXJ);

2、每一个函数(类也是函数)都有一个天生自带的属性:prototype,这个属性存储的是一个对象数据类型的值,
并且这个对象数据类型是浏览器天生给它开的空间在prototype属性对应的堆内存中,有一个天生自带的属性constructor,这个属性指向函数本身。

3、每一个对象数据类型也有一个天生自带的属性:__proto__,这个属性指向所属类的prototype,在IE下不支持__proto__。

posted @ 2018-09-26 17:45  .luke  阅读(143)  评论(0)    收藏  举报