Javascirpt中创建对象的几种方式
2016-05-26 16:28
274 查看
js是一种动态语言,即js的对象创建好之后可以随意修改,因此JS对象的面向对象编程部分更可以说是通过JS的怪异特性来模拟Java这类的面向对象编程的。下面首先讨论几种创建对象的方式:
1. 工厂模式创建
工厂模式,顾名思义就是通过一个函数来创建对象,因为对象的的成员是可以随便修改的,所以在工厂中创建一个Object对象,然后逐次添加自己需要的属性或方法,然后返回这个对象即可,示例如下:
使用时通过:var student = createStudentInstance("aa", 20),这样的语句即可。
2. 通过构造函数创建对象
在js中函数中默认包含一个this指针,但该指针的指向却因调用上下文而不同,当将方法当做普通方法调用时,this指向当前window对象,即当前作用域是全局作用域。而使用new运算符调用的话,当前作用域则为new创建的对象,即this指向当前对象。根据这js的特性就可以模拟构造函数的方式来创建对象。示例如下:
使用时通过:var stu = new Student("aa", 20),这样的语句即可。
3. 通过原型模式创建对象
首先介绍原型模式,在面向对象编程中同一类继承链的对象都是有共性的,而某些共有的属性的值也是要求一样的,因此创建对象是可以定义一个原型,而需要的时候直接拷贝这个原型即可。
在JS中函数都是Function类型的实例,也是一种对象类型,而函数对象中含有prototype属性,而该属性是用做实现原型模式的,即通过给prototype赋予属性和方法,这样当创建一个对象后,对象调用属性或方法时,js会逆着原型链来查找对应的属性和方法,因此如果在对象中定义了一个和原型中同名的属性或方法时就会屏蔽原型中的属性和方法。所以原型中的属性和方法也就类似于Java中的类方法和类属性,只是js中的实例属性/方法会屏蔽原型中的属性/方法。示例代码如下:
1. 工厂模式创建
工厂模式,顾名思义就是通过一个函数来创建对象,因为对象的的成员是可以随便修改的,所以在工厂中创建一个Object对象,然后逐次添加自己需要的属性或方法,然后返回这个对象即可,示例如下:
function createStudentInstance(name, age) { var stu = new Object(); stu.name = name; stu.age = age; stu.goShool = function(){ alert("go to school"); } }
使用时通过:var student = createStudentInstance("aa", 20),这样的语句即可。
2. 通过构造函数创建对象
在js中函数中默认包含一个this指针,但该指针的指向却因调用上下文而不同,当将方法当做普通方法调用时,this指向当前window对象,即当前作用域是全局作用域。而使用new运算符调用的话,当前作用域则为new创建的对象,即this指向当前对象。根据这js的特性就可以模拟构造函数的方式来创建对象。示例如下:
function Student(name, age) { this.name = name; tihs.age = age; this.goSchool = function(){alert("go to school");} }
使用时通过:var stu = new Student("aa", 20),这样的语句即可。
3. 通过原型模式创建对象
首先介绍原型模式,在面向对象编程中同一类继承链的对象都是有共性的,而某些共有的属性的值也是要求一样的,因此创建对象是可以定义一个原型,而需要的时候直接拷贝这个原型即可。
在JS中函数都是Function类型的实例,也是一种对象类型,而函数对象中含有prototype属性,而该属性是用做实现原型模式的,即通过给prototype赋予属性和方法,这样当创建一个对象后,对象调用属性或方法时,js会逆着原型链来查找对应的属性和方法,因此如果在对象中定义了一个和原型中同名的属性或方法时就会屏蔽原型中的属性和方法。所以原型中的属性和方法也就类似于Java中的类方法和类属性,只是js中的实例属性/方法会屏蔽原型中的属性/方法。示例代码如下:
function student(){ } student.prototype = {name:"aa", age:20, goschool:function(){alert("go to school")}} var stu1 = new student(); var stu2 = new student(); stu1.name = "bb"; alert(stu1.name); //bb alert(stu2.name); //aa
相关文章推荐
- Java发送邮件工具类
- JVM内存模型图解
- Java---静态代理VS动态代理
- Spring Security(20)——整合Cas
- SpringMVC的Interceptor
- Spring Security(19)——对Acl的支持
- java.lang.NoClassDefFoundError: org/hibernate/engine/SessionFactoryImplementor
- java责任链模式1
- Spring Security(18)——Jsp标签
- Spring Security(17)——基于方法的权限控制
- 'hibernateTemplate' must be of type [org.springframework.orm.hibernate5.HibernateTemplate]
- Spring Security(16)——基于表达式的权限控制
- 69 个经典 Spring 面试题和答案
- Java 合并word
- Spring Security(15)——权限鉴定结构
- 《Spring学习笔记》:Spring、Hibernate、struts2的整合(以例子来慢慢讲解,篇幅较长)
- Spring Security(14)——权限鉴定基础
- 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)
- Spring Security(13)——session管理
- Spring4 Web开发新特性