当前位置: 首页 > Web前端 > JavaScript

js原型与原型链问题

时间:2023-03-26 23:34:25 JavaScript

在原型中加入属性或方法有什么好处?时间长了,性能就会变差。常用写法Fun.prototype.xx=function(){};Fun.prototype.xx=function(){};Fun.prototype.xx=function(){};这个方法给原型对象添加属性或者方法如果是这样的话,就显得很麻烦了。转换方法Fun.prototype={start:function(){console.log("start");},结束:function(){console.log("结束");},};如何找到Fun的原型对象函数Fun(attr){this.attr=attr;}Player.prototype.start=function(){console.log(attr+"start");};constf1=newFun("1");constf2=newFun("2");console.log(f1.__proto__);//有趣{}console.log(Object.getPrototypeOf(f1));//Fun{},__proto__console可以通过//Object.getPrototypeOf.log(Fun.prototype);//乐趣{}console.log(Fun.__proto__);//[功能]new关键字有什么作用?1创建一个继承自Fun.prototype的新对象f12f1.proto指向Fun.prototype,即f1.proto=Fun.prototype3将this设置为新创建的对象f14返回一个新对象;如果构造函数没有显式返回值,则返回this;如果构造函数有显式返回值,则为Basic类型,如number、string、boolean,则return;如果构造函数有一个明确的返回值,是一个对象类型,比如{a:1},那么返回这个对象{a:1}。通过打印实例,可以验证根据new关键字做了什么,模拟newfunctionFun(name){this.name=name;}functionobjectFactory(){leto=newObject();的实现;让FunctionConstructor=[].shift.call(参数);o.__proto__=FunctionConstructor.prototype;让resultObj=FunctionConstructor.apply(o,arguments);返回类型resultObj===“对象”?resultObj:o;}constf1=objectFactory(Fun,"a");console.log(f1);什么是原型链?在读取实例的属性时,如果找不到,则会在与该对象关联的原型中搜索属性。如果还是找不到,就去找prototype的prototype,找最顶层的一个简单的testcase,如果在Fun的prototype中找不到f1实例,就一直找Object的prototype属性。Object.prototype.x='Object_x'functionFun(){}Fun.prototype.x='Fun_x'constf1=newFun()console.log(f1.x)这样通过proto和prototype连接起来的对象链就是原型链行业的先有鸡还是先有蛋的问题。对象实例函数;//trueFunctioninstanceofObject;//trueObjectinstanceofObject;//trueFunctioninstanceof函数;//true是从第一句和第二句推导出来的Function对象是Function构造函数创建的实例说明1.Function对象是由Function构造函数创建的:根据JavaScript中“实例”的定义,a是b的实例,即ainstanceofb为真,且默认判断条件是b.prototype在a的原型链上。而FunctioninstanceofFunction为true,本质上就是Object.getPrototypeOf(Function)===Function.prototype,正好符合这个定义。解释2.Function对象不是由Function构造函数创建的:Function是一个内置对象,即不存在“Function对象是由Function构造函数创建”,这显然造成了先有鸡还是先有蛋的问题。事实上,当你直接写一个函数时(比如functionf(){}或者x=>x),并没有调用Function构造函数,只有当你显式调用Function构造函数时(比如newFunction('x','返回x'))而已。