深入学习之原型和原型模式

 //1、每一个函数数据类型(普通函数、类)都有一个天生自带的属性:prototype(原型),并且这个属性是一个对象数据类型的值
    //2、并且在prototype上浏览器天生给它加了一个属性constructor(构造函数),属性值是当前函数(类)本身
    //3、每一个对象数据类型(普通的对象、实例、prototype...)也天生自带一个属性:__proto__,属性值是当前实例所属类的原型(prototype)

//3、原型链模式
    //f1.hasOwnProperty("x");//->hasOwnProperty是f1的一个属性
    //但是我们发现在f1的私有属性上并没有这个方法,那如何处理的呢?
    //1)通过 对象名.属性名 的方式获取属性值的时候,首先在对象的私有的属性上进行查找,如果私有中存在这个属性,则获取的是私有的属性值;
    //如果私有的没有,则通过__proto__找到所属类的原型(类的原型上定义的属性和方法都是当前实例公有的属性和方法),原型上存在的话,获取的是公有的属性值;
    //如果原型上也没有,则继续通过原型上的__proto__继续向上查找,一直找到Object.prototype为止...
    //-->这种查找的机制就是我们的"原型链模式"

    function Fn() {
        this.x = 100;
        this.sum = function () {
        };
    }
    Fn.prototype.getX = function () {
        console.log(this.x);
    };
    Fn.prototype.sum = function () {
    };
    var f1 = new Fn;
    var f2 = new Fn;

    console.log(Fn.prototype.constructor === Fn);//->true

    //2、Object是JS中所有对象数据类型的基类(最顶层的类)
    //1)、f1 instanceof Object ->true 因为f1通过__proto__可以向上级查找,不管有多少级,最后总能找到Object
    //2)、在Object.prototype上没有__proto__这个属性


    //3、原型链模式
    //f1.hasOwnProperty("x");//->hasOwnProperty是f1的一个属性
    //但是我们发现在f1的私有属性上并没有这个方法,那如何处理的呢?
    //1)通过 对象名.属性名 的方式获取属性值的时候,首先在对象的私有的属性上进行查找,如果私有中存在这个属性,则获取的是私有的属性值;
    //如果私有的没有,则通过__proto__找到所属类的原型(类的原型上定义的属性和方法都是当前实例公有的属性和方法),原型上存在的话,获取的是公有的属性值;
    //如果原型上也没有,则继续通过原型上的__proto__继续向上查找,一直找到Object.prototype为止...
    //-->这种查找的机制就是我们的"原型链模式"

    //    f1.getX === f2.getX - > true
    //    f1.__proto__.getX === f2.getX - > true
    //    f1.getX === Fn.prototype.getX - > true

    //    f1.sum === f2.__proto__.sum - > false
    //    f1.sum === Fn.prototype.sum; - > false



    var num = 12;
    var obj = {
        num:13,
        fn: (function (num) {
            this.num = num + 20;
            num += 20;
            return function () {
                this.num = num + 20;
                num += 20;
                console.log(num);
            }
        })(num)//->12
    };
    var fn = obj.fn;
    fn();
    obj.fn();
    console.log(window.num, obj.num);



    //所有的对象数据类型(普通对象、数组、正则、实例、类的原型...)都是Object这个基类的一个实例
    //所有的函数数据类型(普通函数、内置类、自定义类...)都是Function这个基类的一个实例
    //函数或者类都是函数数据类型,所有的函数数据类型都是Function的一个实例,所有的实例都是对象数据类型的 -> 函数也是对象数据类型的值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flybirding10011

谢谢支持啊999

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值