javascript对象的创建--相对java 怎样去创建了"类"i以及实例化对象
由于javascript没有java那么多基本类型,同时也没有提供class这个东西,那么我们想实现javascript的对象创建应该怎么办呢,我简单地从w3c提供的课件中提取了一下几种方法:
一.工厂模式
说白了就是类似于c语言中的定义一个函数,然后给一个struct的各个属性复制,再返回这个struct。代码示例:
function person(name,age,sex){
var o=new Object();
o.name=name;
o.age=age;
o.sex=sex;
o.sayName=function(){
alert(this.name);
}
return o;
}
var person1=new person("wangke",21,"Male");
var person2=new person("gaoyuanyuan",34,"Female");
person1.sayName();//wangke
person2.sayName();//gaoyuanyuan
这种办法的确可以创建多个类似的对象,但是个人觉得类似c++中struct与class的区别,它没有解决对象的识别问题。
二.构造函数模式:
其实在javascript中,构造函数和普通函数没什么区别,起码从格式上看来都是一样的,所谓的构造函数无非就是在调用的时候前面加了个new,比如上节的var person1=new person(...)。在这种模式中,通过使用this,将属性和方法赋值给this对象,这样就不用return了,同时一般构造函数的首字母会大写的(这也算是个认为加上去的区别吧)。示例代码:
function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
this.sayName=function(){...};
}
var person1=new Person("wangke",21,"Male");
var person2=new Person("gaoyuanyuan",34,"Female");
这种模式就可以进行类型检测了,通常用instanceof方法:
alert(person1 instanceof Object);//true
alert(person1 instanceof Person);//true
缺陷:每次实例化一个对象,里面的方法都会被重新创建一遍,浪费资源,所以我们可以想着把它放到全局变量中(但是只被个别方法调用,作用域为全局显得名不副实)。修改如下:
function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
this.sayName=sayName;
}
function sayName(){
alert(this.name);
}
使用这种方法的话,会出现太多的全局函数了,所以我们会在下一种这种方法中解决这个问题。
三.原型模式:
了解什么是prototype(原型):w3c给的概念有点绕,我通俗点说:prototype就是“一个给类的对象添加方法的方法”,假如有你把一个对象a赋值为一个对象b,假如对对象a进行拓展的话,那么对象b也能访问a新定义的属性或方法。可能这两句话还是不能理解,那就看代码以及w3c上提供的图(看了图就会恍然大悟了)。
function Person(){
}
Person.prototype={
name:"Nicholas",
age:29,
job:"Soft Engineer",
sayName:function(){
alert(this.name);
}
};
var person1=new Person();
var person2=new Person();
alert(person1.sayName==person2.sayName();//true
备注:1.原型的动态性(开头也提到过,对a的拓展)即可以先创建实例再修改原型也可以:
var person=new Person();
Person.prototype.saySth(){
alert("i want to sleep");
};
person.saySth();//i want to sleep
虽然修改可以立即在所有对象实例中反映过来,但是要重写所有的原型对象就会不一样了。
2.原生对象的原型--不光自定义类型方面原型很重要,所有原生的引用类型都是采用这种模式创建的,所以我们可以自己添加一些方法:
String.prototype.startWith=function(text){
return this.indexof(text)==0;
};
var msg="Hello,World";
alert(msg.startWith("Hello");//true
3.原型模式的缺陷:共享的本性,特别是array。
function Person(){
}
Person.prototype={
name:"Nicholas",
age:29,
job:"Soft Engineer",
friends:["wangke","yuanyuan"],
sayName:function(){
alert(this.name);
}
}
var person1=new Person();
var person2=new Person();
person1.friends.push("xijinping");
alert(person1.friends);//wangke,yuanyuan,xijinping
alert(person2.friends);//wangke,yuanyuan,xijinping
四.组合
现在只要解决了原型模式中共享造成的缺陷,那么就比较完美了,我们注意到第二条的构造函数模式了吗?下面就是最常见的创建自定义类型的方式:
function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
this.friends=["obama","kobe"];
}
Person.prototype={
constructor:Person,
sayName:function(){}
}
实例属性都是在构造函数中定义,而共享的属性和方法都是在原型模式中定义。
五.其他构造方式:
偶尔会用到,大家可以自己查一下:动态原型模式,寄生构造方式 ,稳妥构造函数模式
以上只是个人的一点总结,欢迎大家阅读并交流!
javascript对象的创建--相对java 怎样去创建了"类"i以及实例化对象的更多相关文章
- 依赖注入之setter注入---只需修改配置,电脑就可以安装不同的打印机;读取properties配置文件并创建实例;实现不采用new的方式直接实例化对象
1.项目截图 2.黑白打印机类 package com.example.demo.printer; public class GrayPrinter implements Printer{ @Over ...
- 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)
本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...
- Java实例化对象过程中的内存分配
Java实例化对象过程中的内存分配: https://blog.csdn.net/qq_36934826/article/details/82685791 问题引入这里先定义一个很不标准的“书”类,这 ...
- 数据库连接工具类 数据库连接工具类——仅仅获得连接对象 ConnDB.java
package com.util; import java.sql.Connection; import java.sql.DriverManager; /** * 数据库连接工具类——仅仅获得连接对 ...
- Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式
1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...
- 乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性
大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象.接口与父类.修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有new .克隆.反 ...
- 转:【深入Java虚拟机】之三:类初始化
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17845821 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Jav ...
- 【深入Java虚拟机】之三:类初始化
类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码.虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 遇到new.getstatic.putstatic ...
- 2016/3/21 面向对象: ①定义类 ②实例化对象 ③$this关键字 ④构造函数 ⑤析构函数 ⑥封装 ⑦继承
一:定义类 二:实例化对象 //定义类 class Ren { var $name; var $sex; var $age; function Say() { echo "{$this- ...
随机推荐
- gawk的用法
GNU gawk工具的功能是将指定文件中符合指定模式(pattern)的行按指定的动作(action)进行格式化处理 语法:gawk [options] [program] [file-lis ...
- java基础(System.err和System.out)
今天有位同事在使用System.err和System.out遇上了一些小问题. 看了些资料总结下: 1.JDK文档对两者的解释: out: "标准"输出流.此流已打开并准备接受输出 ...
- 解决laydate时间日期插件定位溢出
laydate是一款比较好用的网页时间日期插件,不过用起来有一些细节问题需要我们手动去解决!例如:laydate兼容bootstrap 1. 默认情况 laydate弹出层默认对齐input左边框 2 ...
- 门(door)
门(door) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 输入 第一行是一个正整数n,表示原始字符串的长度.第二行是一个字符串,长度为n.字符串由大小写字母,数字,符号,空格构成. ...
- java中方法总结(每周更新)
1.URLEncoder.encode(username,"utf-8")将"utf-8"编码的username先解码,然后再采用URL编码 2.URLDeco ...
- $.Deferred 延迟对象
一.什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们 ...
- uwp版的音乐播放器练手
UWP项目之音乐播放器 这个项目本来是我女朋友的一个小作业,她做不出来,结果只能是我来代劳.经过几天的时间虽然赶出来了,但是自己不是很满意,还有很多不满意的地方,因此决定在最近的一段时间内,重新完成. ...
- UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
多人游戏的关卡切换分为无缝和非无缝.非无缝切换时,客户端将跟服务器断开连接,然后重新连接到同一个服务器,服务器则加载一个新地图.无缝切换不会发生这样的情况. 有三个函数供我们使用:UEngine::B ...
- javascript字符串属性及常用方法总结
length属性:str.length; 常用方法: 1. str.charAt(n) 查找字符串中的第n个字符,如果不在0~str.length-1之间,则返回一个空字符串 2 .str.ind ...
- [leetcode-567-Permutation in String]
Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. I ...