zoukankan      html  css  js  c++  java
  • JS的原型及原型链

    1.面向对象

    JS一开始就是写页面特效,面向过程的。作者发现这样写不好,代码重复利用率太高,计算机内存消耗太大,网页性能太差,所以作者就受到了Java和c的影响,在面向对象上靠齐,JS天生有一个object,但它没有面向对象的特征(封装,继承,多态)最后研究出了构造函数

    构造函数最终目的是生成对象

    我们把封装的那个函数叫类,类里面的属性是私有的

    类原型上的属性是公有的,可继承。

    1.类本身天生自带一个prototype属性,这个属性是对象

    2.prototype对象天生有一个constructor属性,这个属性值是类本身

    3.实例本身天生自带一个__proto__属性,指向类的原型

    prototype和__proto__的区别

     
    var a = {};
    console.log(a.prototype);  //undefined
    console.log(a.__proto__);  //Object {}
    
    var b = function(){}
    console.log(b.prototype);  //b {}
    console.log(b.__proto__);  //function() {}
     

    复制代码
    /*1、字面量方式*/
    var a = {};
    console.log(a.__proto__);  //Object {}
    
    console.log(a.__proto__ === a.constructor.prototype); //true
    
    /*2、构造器方式*/
    var A = function(){};
    var a = new A();
    console.log(a.__proto__); //A {}
    
    console.log(a.__proto__ === a.constructor.prototype); //true
    
    /*3、Object.create()方式*/
    var a1 = {a:1}
    var a2 = Object.create(a1);
    console.log(a2.__proto__); //Object {a: 1}
    
    console.log(a.__proto__ === a.constructor.prototype); //false(此处即为图1中的例外情况)
    复制代码

    什么是原型链?

    var A = function(){};
    var a = new A();
    console.log(a.__proto__); //A {}(即构造器function A 的原型对象)
    console.log(a.__proto__.__proto__); //Object {}(即构造器function Object 的原型对象)
    console.log(a.__proto__.__proto__.__proto__); //null

    var a和a的区别

    没有带var的变量就不能存放到内存地址中。就没有变量提升这种说法了。相当于给window加了一个属性window.a。

    带var 可以存放在内存地址中,有变量提升,同时也相当于给window加了一个属性window.a

    原型链主要针对对象的属性来说的

    作用域链主要针对变量来说的

  • 相关阅读:
    论文阅读笔记(四)【TIP2017】:Video-Based Pedestrian Re-Identification by Adaptive Spatio-Temporal Appearance Model
    论文阅读目录
    【学习】从.txt文件读取生成编译代码。
    页面显示其他电脑图片(局域网)
    控制台爬取小说(大王饶命)
    【自学】大话设计模式控制台
    将PDF转化为wrod
    【学习】爬糗事百科,可自动翻页。
    AHP(使用于某项目设备重要度评估测试)
    【学习】类重构、通用值交换、释放内存计算时间等
  • 原文地址:https://www.cnblogs.com/mo123/p/9896334.html
Copyright © 2011-2022 走看看