企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 面向对象与原型 ## 一、对象创建 ~~~ var box={}; box.name='tianwei'; box.age='30'; box.run=function(){ return this.age+this.name+"运行中..." } alert(box.run()); ~~~ ###1. 工厂模式: 解决多个相似对象声明代码重复的问题 ~~~ function createObject(name,age){ var obj=new Object(); obj.name=name; obj.age=age; obj.run=function(){ return this.name+this.age+"运行中..."; }; return obj; } var box1=createObject('田伟',100); var box2=createObject('宝宝',1000); alert(box1.run()); alert(box2.run()); ~~~ ###2. 构造函数模式:解决工厂模式下,不能确定是哪个对象创建的对象实例 a. 构造函数也是函数,但函数名第一个字母大写 b. 必须new 构造函数() ,才能实例化,第一个字母也是大写 ~~~ function Box(name,age){ //创建对象 后台自动创建 new Object(),无需像工厂一样返回对象 this.age=age; //实例属性 this.name=name; this.run=function(){ //实例方法 return this.age+this.name+"运行中..." }; } var box1=new Box("田伟",100); var box2 =new Box('严慧',200); alert(box1.run()); alert(box2.run()); //对象冒充 var o = new Object(); Box.call(o,'田伟',500); alert(o.run()); ~~~ 实例属性,实例方法不会共享 删除实例属性:delete Box.name; ## 原型 每创建一个构造函数,就会自动生成一个prototype属性对象。 ~~~ function Box(){} Box.prototype.name="田伟"; Box.prototype.age=100; Box.prototype.run=function(){ return this.name+this.age+"运行"; } var box1=new Box(); //原型解决了对象里的函数引用地址共享 var box2=new Box(); box1.run==box2.run; ~~~ ![](https://box.kancloud.cn/23be510e5f08eb174e0c83a241dbf6d1_434x379.png) ![](https://box.kancloud.cn/8965621a03fc862119a6121ad1b1fe96_659x398.png) ### 构造函数+原型组合模式,解决共享问题 ~~~ function Box(name,age){ //可变常量部分 this.name=name; this.age=age; this.family=[3,5,6]; } Box.prototype={ //不变的方法部分 constructor:Box, run:function(){ return this.name+this.age+'运行中....'; } } var box1=new Box('tianwei',300); alert(box1.run()); ~~~ ### 动态原型模式 把原型封装到对象中 ~~~ function Box(name,age){ //可变常量部分 this.name=name; this.age=age; this.family=[3,5,6]; if(typeof this.run!=='function'){ //仅在第一次调用的时候初始化 Box.prototype=function(){ return this.name+this.age+'运行中....'; } } } ~~~