zoukankan      html  css  js  c++  java
  • 对js原型的理解

    1.值类型和引用类型,引用类型都是对象,通过typeof()测试类型,instanceof测试是否是对象。对象是属性的集合。

    2.对象都是由函数创建的,函数又是一个对象。

    3.函数有一个默认的属性,叫prototype,这个prototype的属性值是一个对象,即属性的集合,默认只有constructor这个属性,指向函数本身,prototype里面可以增加自己的属性。

    function Fn(){}

    Fn.prototype.name="王福朋";

    Fn.prototype.getYear = function(){return 1988;};

    var fn=new Fn();

    console.log(fn.name);

    console.(fn.getYear());

    Fn是一个函数,fn对象从Fn函数new出来,这样fn对象就可以调用Fn.prototype中的属性。

    每个对象都有一个隐藏的属性叫"__proto__",这个属性引用了创建这个对象的函数的prototype,即fn._proto_===Fn.prototype。

    每个对象都有一个'__proto__',可成为"隐式原型"。

    var obj={};

    console.log(obj.__proto__);

    用console.log(obj.__proto__)查看,返回值与Object.prototype的属性一样。

     即obj.__proto__===Object.prototype;所以,每个对象都有一个__proto__属性指向创建该对象的函数的prototype;

    自定义函数的prototype本质是和var obj={}是一样的,由Object创建,所以它的__proto__指向的是Object.prototype,而Object.prototype是一个特例,它的__proto__指向null。

    (图片来自 王福朋的博客园)

     自定义函数Foo.__proto__指向Function.prototype,Object.__proto__指向Function.prototype,Function.__proto__指向Function.prototype.

    Function.prototype指向的对象的__proto__指向Object.prototype.

    4.typeof对引用类型只能检测是否是对象或者函数,不能检测出是数组还是New Number等等,用Instanceof可以。

    instanceof运算符的第一个变量是一个对象A第二个变量一般是一个函数B,判断规则是:

    沿着A 的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true,如果找到重点还未重合,则返回false。

    instanceof表示的是一种继承关系,或者原型链的结构。

    5.原型链  即是访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条线向上找。

    通过hasOwnProperty,能够区分属性到底是基本的还是从原型中找到的。

    function Foo(){}

    var f1=new Foo();

    f1.a=10;

    Foo.prototype.a=100;

    Foo.prototype.b=200;

    var item;

    for(itrm in f1){

    console.log(item);//输除a b;如果为if(f1.hasOwnProperty(item)){console.log(item);};则只返回a;

    }

    f1的hasOwnProperty方法来自于Object.prototype。

    所有对象的原型链都会找到Object.prototype,因此所有对象都有有Object.prototyp的方法,这就是所谓的"继承"。

     对象或者函数被new出来后,可能没有属性,可以自己添加。如果继承方法不合适,可以进行修改。

    function Foo(){}

    var f=new Foo(){

    return:'name';

    };

    console.log(f1.toString());//name

    6.执行上下文

    即在"准备工作"中完成的工作:

     变量、函数表达式--变量声明,默认赋值为undefined

      this--赋值

     函数声明--赋值;

    JavaScript在执行一个代码段之前,都会进行这些—“准备工作”来执行上下文,这个“代码段”分三种情况--全局代码(<script>//代码段</script>),函数体,eval代码。

  • 相关阅读:
    我的博客
    【git】给文件重命名的简便方法
    【git】通过几次commit来认识工作区和暂存区
    2018年2月份面试题
    【git】建git仓库
    【git】git的安装和最小配置
    selenium WebDriver的实现原理
    什么是selenium
    selenium的安装
    monkey停不下来了怎么整
  • 原文地址:https://www.cnblogs.com/lionisnotkitty/p/5992085.html
Copyright © 2011-2022 走看看