函数原型prototype以及对象的隐式原型__prot0__的基本了解

prototype原型:

一. 函数与对象的关系
   1. 函数是对象的一种(函数是对象类型) 
      例: function fn1(){.........}
          console.log(fn1 instanceof Object);
          返回true,说明函数(fn1)是对象类型.

2. 对象是由函数创建的
      例: var obj = new Object();
          var arr = new Array(3);
          arr[0] = 0;
          arr[1] = 1;
          arr[2] = 2;
          console.log(typeof Object); //obj由Object创建
          console.log(typeof Array); // arr由Array创建
          返回: 上面两句console.log()语句都返回Function,
          说明对象是由函数创建的.

二. prototype 原型(函数的属性)
    1. 原理: prototype是函数里的属性,每一个函数都有prototype这个属性,这个属性   的值是一个对象,这个对象默认只有一个constructor的属性,且这个对象指向的是该函数本身.

2. 构造函数中的属性与原型中的属性的区别
       1. 构造函数中的属性(或方法)
          例: function fun(){
                 this.arr = [1,2,3,4,5];
              }
              var fun1 = new fun();
              fun1.arr.push(6);
              var fun2 = new fun();
              console.log(fun1.arr); //返回{1,2,3,4,5,6}
              console.log(fun2.arr); //返回{1,2,3,4,5}
          说明:构造函数中的属性,对于由该函数所创建的对象来说,该属性是各自独立拥有的,即fun1里的arr,与fun2里的arr是两个不同的数组对象,占用的是不同的内存区域.
          
       2. 原型中的属性(或方法)
          例: function fun(){.....} 
              fun.prototype.arr = [1,2,3,4,5];
              var fun1 = new fun();
              fun1.arr.push(6);
              var fun2 = new fun();
              console.log(fun1.arr); //返回{1,2,3,4,5,6}
              console.log(fun2.arr); //返回{1,2,3,4,5,6}
          说明: 在函数的原型里设置的属性,对于由该函数所创建的对象来说,该属性是这些对象所共同享有的,这个属性在内存中始终都只占用一块区域;即修改任何一个对象的该属性的值,其他对象的该属性的值也会被修改,因为它们共享一块内存区域

总体说明:  1. 由上可见,把属性定义在原型中,比定义在构造函数内所耗的内存更小(始终都只占用一块内存区域).
             2. 构造函数内的定义的属性的优先级高于原型中定义的属性的优先级;如果定义了同名称的属性或方法,构造函数内的属性或方法会覆盖原型中的同名称的属性或方法.
             3. 所以,如果没有特殊情况,我们一般在函数体内定义属性,在原型中定义行为.

三. __proto__ 隐式原型(对象的属性)
   1. 原理: __proto__是对象的属性,每一个对象都有__proto__这个属性,对象的这个属性指向的是创建该对象的函数的原型
      例: function Person(){}
          var p1 = new Person();
          console.log(p1.__proto__); //返回Person{}这个函数
          console.log(Person.prototype); //返回Person{}这个函数
      解释: 1. (p1.__proto__)指向的是Person这个函数的原型(Person.prototype),(Person.prototype指向的是Person    {},故(p1.__proto__)最终所返回的结果就是Person{}这个函数;
            2. Person.prototype指向的就是Person{}这个函数
            综上, 故(p1.__proto)===(Person.prototype)这个表达式返回为true.

2. 各种指向(fun1为一个函数)
   
      1. fun1.prototype.__proto__  ----> Object.prototype
      
         解释:  1. 函数的prototype是一个对象,故其有__proto__属性;
               2.这里的prototype属于自定义函数,而自定义函数本质上都是通过 Object函数来创建的;
               3. Object.prototype.__proto__  ----> null;

2. fun1.__proto__  ----> Function.prototype   
         
         解释: 1. 函数是对象类型,故其有__proto__这个属性;
               2. 函数都是被Function创建,故fun1就是被Function创建的,所以创建
                  fun1这个函数对象的函数原型为Function.prototype;

引出: Object是函数,故Object被Function创建: Object.__proto__  ----> Function.prototype;

3. Function.__proto__  ----> Function.prototype
      
         解释: 1. Function是函数,函数又是对象的一种,故Function也有__proto__属性;
                  函数都是被Function创建,故Function这个函数对象是被其自身所创建,故
                 创建Function这个函数对象的函数原型为Function.prototype;

4. Function.prototype.__proto__  ----> Object.prototype
      
         解释: 1. Function的prototype是被Object所创建的对象,故这个prototype的__proto__指向的是 Object.prototype;

四. instanceof (判断对象的类型)
    1. typeof 是用于判断值类型,String/Boolean/Number;当其判断引用类型时,返回值只有Object/Function,
       你不知道它到底是一个Object对象,还是数组等(这句不太理解);

2. instancof 判断规则: A instanceof B, 沿着A的__proto__属性查找创建对象A的函数的原型;
                          沿着B的prototype属性查找B的函数;如果两条线能找到同一个引用,
                          或是同一个函数对象,那么返回true;如果找到最终点却还是为重合,返回false.
        
        例: 1. console.log(Object instanceof Function); //返回true
               解释: Object的函数原型为Function,Function的prototype指向Function,故返回true.

2. console.log(Function instanceof Object); //返回true(不太理解)
               解释: Function的函数原型为Function,Object的prototype指向Object,而函数是对象的一种,故返回true.

3. console.log(Function instanceof Function);//返回true
               解释: Function的函数原型为Function,Function的prototype指向Function,故返回true


-

时间: 2024-10-23 00:39:47

函数原型prototype以及对象的隐式原型__prot0__的基本了解的相关文章

JavaScript中显式原型和隐式原型的联系

显式原型:prototype 隐式原型:__proto__ 1.显式原型和隐式原型是什么? 在js中万物皆对象,方法(Function)是对象,方法的原型(Function.prototype)是对象,对象具有属性(__proto__)称为隐式原型,对象的隐式原型指向构造该对象的构造函数的显式原型. 方法(Function)是一个特殊的对象,除了和其他对象一样具有__proto__属性以外,它还有一个自己特有的原型属性(prototype),这个属性是一个指针,指向原型对象.原型对象也有一个属性

构造函数、原型对象、实例、隐式原型的理解

(欢迎一起探讨,如果有什么地方写的不准确或是不正确也欢迎大家指点,最后留了一个疑问,欢迎各位大神来探讨~) PS: 内容中的__proto__可能会被markdown语法导致显示为proto. 建议将构造函数中的方法都定义到构造函数的原型中,由该构造函数创建的实例的方法都会指向同一个方法.(在内部声明的话,每创建一个实例都会重新实例化函数,每个实例中的函数的指向是不同的:如果定义在全局中,且有很多方法,这样毫无封装性可言.) 一.属性和方法 构造函数可以定义三种属性和方法: 对象属性/对象方法:

深入理解javascript原型和闭包(4)——隐式原型

转载于http://www.cnblogs.com/wangfupeng1988/p/3979290.html 注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到,每个函数function都有一个prototype,即原型.这里再加一句话——每个对象都有一个__proto__,可成为隐式原型. 这个__proto__是一个隐藏的属性,javascript不希

深入理解js——隐式原型

每个函数都有一个prototye(原型),而每个对象都有一个_proto_,可成为隐式原型. _proto_是一个隐藏的属性,javascript不希望开发者用到这个属性值,有的低版本浏览器甚至不支持这个属性值.所以你在Visual Studio 2012这样很高级很智能的编辑器中,都不会有__proto__的智能提示,但是你不用管它,直接写出来就是了. var obj={},去控制台输出obj._proto_,会发现obj.__proto__和Object.prototype的属性一样.因为o

理解javascript原型和作用域系列(4)——隐式原型

上节已经提到,每个函数function都有一个prototype,即原型.这里再加一句话——每个对象都有一个__proto__,可成为隐式原型. 这个__proto__是一个隐藏的属性,javascript不希望开发者用到这个属性值,有的低版本浏览器甚至不支持这个属性值.所以你在Visual Studio 2012这样很高级很智能的编辑器中,都不会有__proto__的智能提示,但是你不用管它,直接写出来就是了. 上面截图看来,obj.__proto__和Object.prototype的属性一

JS高阶---显式原型和隐式原型

前言: 1.函数对象即函数的prototype原型属性指向原型对象,在创建函数时便存在,默认为空Object 2.实例对象的__proto__隐式原型在实例化创建实例时产生,值等于构造函数的显式prototype原型属性的值 3.开发时程序员操作显式原型在原型prototype上添加方法,不能直接操作隐式原型__proto__(ES6之前) 大纲: [主体] (1)每个函数都有一个prototype原型属性,称之为显式原型属性或显式原型 (2)每个实例对象都有一个__prop__原型属性,称之为

Objective-C设计模式——原型Prototype(对象创建)

1.原型 原型设计模式所谓原型设计模式,其实就是对象复制,这个特性在所有语言基本上都是存在的. 我们知道在OC中,对象赋值其实是对对象的引用复制,其实就是相当于C语言中的指针.创建了一个新的变量,但是还是指向的同一块内存地址. 所以一旦一个引用改变了该对象的属性,那么其他指向该对象的引用全部都会发生变化. 有时候我们并不像要这样做,我们希望重新创建一个和赋值对象一模一样的一个对象.比如我们写游戏的时候创建了一个enemy对象并对其复杂的行走路径进行了自定义,此时我们想要在创建一个.但是再次创建时

[js高手之路]一步步图解javascript的原型(prototype)对象,原型链

我们接着上文继续,我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉. function CreateObj(uName) {             this.userName = uName;         }         CreateObj.prototype.showUserName = function(){             return this.userName;         }         va

对象 原型prototype

一.对象   1. var person={          name:"kobe",//键值必须用,间隔          "age":30,          sayName:function(){              console.log("i'm"+this.name);          }     }; 可配置性:指明该属性是否可以修改.删除   可删除configurable:true/false   若 configur