JavaScript学习(一)将实例状态存储在实例对象中,方法存储在原型中
2017-09-23 11:15
190 查看
最近受到一位前辈的启发,萌生了写技术博客的想法。一来巩固自己的知识,查漏补缺,不断提高;二来一家之见总是片面,博采众长,接受批评才能更好的进步。下面是最近在完成一个框架的扩展时所接触到的一些知识中的一点的总结,也从一些经典的书籍、网友的博客中汲取了很多的灵感,辅以自己的理解,分享出来,如果有幸能让大家有所收获,那就再好不过;如果出现错误,还请大家指正。
我们在使用js进行类式编程的时候,常常会需要给new出来的实例添加属于当前实例的独有的属性,在不理解原型与实例关系的情况下,我们可能会写成如下这样:
很明显,这样为实例添加属性是不恰当的。因为我们在对不同的实例进行setAge操作时影响到了其他的实例,这样实例的属性会失去独立性,也失去了意义。
出现这样的情况原因是Person的prototype对象是所有实例共享的,任何实例对其中的属性 进行操作都会影响到其他的实例。所以若要添加只属于某个实例的自己的属性,我们应当将这样的属性存储到实例对象自身当中,如下:
这样,实例的属性就成为了相互独立的,任何实例操作自身的属性都不会影响到其他实例的属性。
通常来说,实例独有的属性我们会存储到实例对象自身当中。一些永远不需要改变的属性或者本身就需要改变的属性会存储到原型对象当中。
通常来说,方法是没有状态的,并且各个实例对象之间也可以共享,因此方法一般会被放在原型对象之中。
我们在使用js进行类式编程的时候,常常会需要给new出来的实例添加属于当前实例的独有的属性,在不理解原型与实例关系的情况下,我们可能会写成如下这样:
//定义一个Person构造函数,我们可以把它理解为类 function Person(name){ this.name=name; } //为Person的原型增加方法和属性 Person.prototype={ age:[], setAge:function(age){ this.age.push(age); } } //实例化xm对象,并赋值输出 var xm=new Person("小明"); xm.setAge(19); console.log(xm.name+":"+xm.age);//小明:19 //实例化xh对象,并赋值输出,发现已经改变 var xh=new Person("小华"); xh.setAge(16); console.log(xh.name+":"+xh.age);//小华:19,16
很明显,这样为实例添加属性是不恰当的。因为我们在对不同的实例进行setAge操作时影响到了其他的实例,这样实例的属性会失去独立性,也失去了意义。
出现这样的情况原因是Person的prototype对象是所有实例共享的,任何实例对其中的属性 进行操作都会影响到其他的实例。所以若要添加只属于某个实例的自己的属性,我们应当将这样的属性存储到实例对象自身当中,如下:
//定义一个Person构造函数,我们可以把它理解为类 function Person(name){ this.name=name; this.age=[]; } //为Person的原型增加方法和属性 Person.prototype={s setAge:function(age){ this.age.push(age); } } //实例化xm对象,并赋值输出 var xm=new Person("小明"); xm.setAge(19); console.log(xm.name+":"+xm.age);//小明:19 //实例化xh对象,并赋值输出 var xh=new Person("小华"); xh.setAge(16); console.log(xh.name+":"+xh.age);//小华:16
这样,实例的属性就成为了相互独立的,任何实例操作自身的属性都不会影响到其他实例的属性。
通常来说,实例独有的属性我们会存储到实例对象自身当中。一些永远不需要改变的属性或者本身就需要改变的属性会存储到原型对象当中。
通常来说,方法是没有状态的,并且各个实例对象之间也可以共享,因此方法一般会被放在原型对象之中。
相关文章推荐
- js入门实例の构造函数\方法的定义和调用\原型对象
- js入门实例の构造函数\方法的定义和调用\原型对象
- js入门实例の构造函数/方法的定义和调用/原型对象
- Javascript 面向对象一:封装数据个方法,从原型对象生成实例
- javascript中原型对象和实例对象及ECMA5新方法
- [Effective JavaScript 笔记]第36条:只将实例状态存储在实例对象中
- js入门实例の构造函数/方法的定义和调用/原型对象
- (转载)js对象原来也有类、实例属性和原型属性
- JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
- JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
- 用VC,VB进行图像数据(二进制大对象)存储数据库的方法
- C# 反射详解:定义、创建对象、调用实例方法及静态方法
- 卓越班暑假培训笔记(一)----java(类和对象的概念、实例变量、方法重载、构造方法、数据类型)
- 构造函数、原型对象及其实例对象
- 关于asp输出json对象的方法及实例
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- 2.0 面向对象 类与实例(关键字)、封装、继承、多态(虚方法,抽象类,抽象方法,接口)
- 写一个方法进行各种属性的更新,而不要每个界面设置改变都改变一个属性。就是点击应用或确定按钮时调用这个更新属性的方法,遍历所有(控制对象属性的)界面控件的状态(值),进行属性修改和刷新。
- 【Java】【TIJ】实现一个类:不允许用构造方法来直接创建类实例(对象)
- 实例对象、构造函数和原型之间的关系