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
本质上是沿着隐式原型查找,
别名:隐式原型链
*
访问一个对象的属性或方法时,是怎么查找的?
**先在自身属性中查找,找到返回 **如果没有,再沿着__proto__这条链向上查找,找到返回 **如果最终没有找到,返回“undefined”
3.6原型链的作用:
查找对象的属性(方法)【课外:查找变量是作用域链】
2、构造函数、原型、实体对象关系图
var o1 = new Object();
var o2 = {};
3、构造函数、原型、实体对象的关系2图
function Foo(){ }
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();
推荐阅读
-
javascript基于原型链的继承及call和apply函数用法分析
-
JavaScript中构造函数与原型链之间的关系详解
-
前端笔记知识点整合之JavaScript面向对象(一)Object&函数上下文&构造函数&原型链
-
基于JavaScript实现的继承机制之原型链(prototype)的实现教程
-
javascript基于原型链的继承及call和apply函数用法分析
-
我的javascript 函数链之演变_javascript技巧
-
我的javascript 函数链之演变_javascript技巧
-
深入浅出JavaScript之原型链和继承的详解
-
JavaScript中构造函数与原型链之间的关系详解
-
前端笔记知识点整合之JavaScript面向对象(一)Object&函数上下文&构造函数&原型链