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代码。

  • 相关阅读:
    108. Convert Sorted Array to Binary Search Tree
    107. Binary Tree Level Order Traversal II
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    104. Maximum Depth of Binary Tree
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    系统和进程相关信息
    文件I/0缓冲
    系统编程概念(文件系统mount等函数的使用)
  • 原文地址:https://www.cnblogs.com/lionisnotkitty/p/5992085.html
Copyright © 2011-2022 走看看