欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript之函数的高级(二)原型链

程序员文章站 2022-05-08 15:00:06
...

3、原型链

原型链的尽头:Object原型对象,即__proto__=null

3.1 什么才具有prototype?=====》

*函数对象,(函数名. 作为对象)
new Object()没有prototype属性,因为不是一个函数对象,而是一个实例对象。
Object本身有prototype属性

什么是prototype?什么时候产生?

prototype是引用变量属性,指向的是一个对象(原型对象)。
创建函数对象的时候产生prototype属性。

3.2那么什么时候创建函数对象?

定义函数的时候

***1:执行函数定义
***2、执行函数

3.3 执行函数定义的时候,函数体执行没有?

没有执行,只是创建一个函数对象。
函数名()的时候是执行函数

3.4什么是函数?

函数是一个特殊的对象,特殊的地方在于可以执行,可以执行是因为函数内部是n条代码(语句)

3.5创建函数对象的时候,内部做了什么事情?

添加一条语句(this.prototype={}),即创建了一个空的Object对象,也就是原型对象。this是创建的函数对象

1、原型链(图解)prototype
JavaScript之函数的高级(二)原型链
本质上是沿着隐式原型查找,
别名:隐式原型链
*

访问一个对象的属性或方法时,是怎么查找的?

**先在自身属性中查找,找到返回
**如果没有,再沿着__proto__这条链向上查找,找到返回
**如果最终没有找到,返回“undefined”

3.6原型链的作用:

查找对象的属性(方法)【课外:查找变量是作用域链】
2、构造函数、原型、实体对象关系图

var o1 = new Object();
var o2 = {};

JavaScript之函数的高级(二)原型链
3、构造函数、原型、实体对象的关系2图

function Foo(){  }

JavaScript之函数的高级(二)原型链

11、函数的显示原型指向的对象:默认是空Object实例对象【但是Object的prototype不满足,】(代码见下面)

//11
console.log(Fn.prototype instanceof Object);//true
console.log(Function.prototype instanceof Object);//true
   console.log(Object.prototype instanceof Object);//false

22、所有函数都是Function的实例,包括它本身(Function)
**Object的原型对象是原型链的尽头,也就是Object.prototype.__proto__为null(代码见下面)

  //22
    console.log(Function.__proto__ === Function.prototype);//true
//22 **
    console.log(Object.prototype.__proto__);//null


console.log(Object);/*
ƒ Object() { [native code] }
*/
// console.log(Object.prototype);
/*
* {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
* constructor: ƒ Object()hasOwnProperty: ƒ hasOwnProperty()isPrototypeOf: ƒ isPrototypeOf()propertyIsEnumerable: ƒ propertyIsEnumerable()toLocaleString: ƒ toLocaleString()toString: ƒ toString()arguments: (...)caller: (...)length: 0name: "toString"__proto__: ƒ ()[[Scopes]]: Scopes[0]valueOf: ƒ valueOf()__defineGetter__: ƒ __defineGetter__()__defineSetter__: ƒ __defineSetter__()__lookupGetter__: ƒ __lookupGetter__()__lookupSetter__: ƒ __lookupSetter__()get __proto__: ƒ __proto__()set __proto__: ƒ __proto__()

* */

console.log(Object.prototype.__proto__);//null


function Fn(){
   this.test1=function () {
       console.log('test1()');
   } 
}
Fn.prototype.test2=function () {
   console.log('test2()');
}
var fn= new Fn();
fn.test1();
fn.test2();
console.log(fn.toString());//[object Object]
// console.log(fn.test3);//undefined
// fn.test3();