javascript定义对象的方式
javascript定义对象的方式(javascript中没有类,只有对象)
1)基于已有对象扩充属性和方法(弊端:每次创建都与要重新定义属性方法)
var object = new Object();
alert(object.name); //打印undefined
//object["name"] = "zhaoyilin"
object.name = "zhaoyilin"; //为object增添了name属性
object.sayName = function(name){ //为object增添sayName函数
this.name = name;
alert(this.name);
}
//var object = {username: zhangsan , password :123};(这样定义最常见)
alert(object.name); //打印zhaoyilin
delete object.name; //删除
alert(object.name) ; //打印undefined
2)工厂方式
//工厂方式创建对象
1:function createObject(password){
var object = new Object();
object.username = "张三";
pbject.password = password;
object.getusername = function(){
alert(this.username);
}
return object;
}
var object1 = createObject();(弊端:每生成一个对象,都会生成新的getusername方法,浪费内存,我们多个对象需要多份
属性,但只需要共享一个函数对象)
2://改进版
function getusername(){
alert(this.username);
}
function createObject(password){
var object = new Object();
object.username = "张三";
pbject.password = password;
object.getusername = getusername; //返回引用
return object;
}
var object1 = createObject();
弊端: 不是很清晰 getusername()方法分开了
3)构造函数方式
function Person(//可以传参数){
//在执行第一行代码前,js引擎会为我们生成一个对象
this.username = "zhangsan"
this.password = "123"
this.getInfo = function(){
alert(this.username+","+"this.password")
}
//此处有一个隐藏的return语句,用于将之前生成的对象返回(必须要用new产生对象才会return)
}
var person = new Person();
4)原型("prototype")方式
//使用prototype方式创建对象(prototype是Object对象里面的属性)
1: function Person(){
}
Person.prototype.username = "zhangsan";
Person.prototype.getusername = function(){
alert(this.username);
}
var person = new Person(); //这样生成的对象都拥有username属性和getusername函数
弊端:单纯使用原型方式定义类无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。
2: function Person(){
}
Person.prototype.username = new Array();
Person.prototype.getusername = function(){
alert(this.username);
}
var person = new Person();
person.prototype.push("zhangsan");
person.prototype.push("lisi")
var person2 = new Person();
person.getusername();
person2.getusername();
//这两个对象调用getusername()方法都是输出"zhangsan" "lisi" 这就引出了另一个弊端:
如果使用原型方式对象,那么生成的对象会共项原型中的属性,这样一个对象改变了该属性也会反映到其他对象中.
person ----------->Person ----
|----->username //这和java的内存管理机制一样
person2----------->Person ----
3: 改进版 : 原型+构造函数定义对象(即不共享属性,但共享方法,是个很好的解决方案)
function Person(){
this.username = new Array();
}
Person.prototype.getInfo = function(){
alert(this.username);
}
var p = new Person();
var p2 = new Pesron();
p.username.push("zhangsan");
p2.usename.push("lisi");
调用getInfo() p对象输出zhangsan p2输出lisi 两个数组对象不会相互影响。
5)动态原型方式:在构造函数中定义一个标志量
function Person(){
this.username = "zhangsan";
if(typeof Person.flag == "undefined"){
alert("invoked!");
Person.prototype.getInfo = function(){ //执行一次就会产生共享方法
alert(this.username);
}
Person.flag = true;
}
}
var person = new Person();
var person2 = new Person();
person.getInfo(); //"invoked!" "zhangsan"
person2.getInfo(); //"zhangsan"
javascript定义对象的方式的更多相关文章
- javaScript定义对象的方法
转自souhu新闻http://news.sohu.com/20110215/n279335637.shtml? javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放 ...
- javascript定义对象写法
javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 funct ...
- JavaScript 的对象继承方式,有几种写法?
JavaScript 的对象继承方式,有几种写法? 一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使 Pa ...
- 架构师JavaScript 的对象继承方式,有几种程序写法?
架构师JavaScript 的对象继承方式,有几种程序写法? 一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数, ...
- JavaScript定义类的方式与其它OO语言有些差异
JavaScript面向对象的程序编写与其它OO语言有一些出入,所以使用JavaScript的面向对象特性的时候,需要注意一些规范性的问题.下面就简单地谈一下,JavaScript如何定义一个类,在定 ...
- javascript定义函数不同方式的区别
学习javascript中遇到了这么一个问题,代码如下: var test = 'a'; function test() { alert('Hello World!'); } alert(test); ...
- js中定义对象的方式有哪些?
1.对象直接量 2.构造函数 3.原型方法 4.动态原型方法
- 【JS】#001 JS定义对象写法(原型、JSON方式)
下面主要写两种 JS 定义对象的 常用写法 写法1:[很像面向对象语言中的写法] function zhongxia(age) { this.age = age; } zhongxia.name = ...
- 关于javascript自定义对象(来自网络)(最近几天不会的)
javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 funct ...
随机推荐
- MyBatis子查询
一.父查询BaseChildResultMap: <?xml version="1.0" encoding="UTF-8" ?> <!DOCT ...
- 牛客326B 背单词
传送门:https://ac.nowcoder.com/acm/contest/326/B 题意:给你一个n,你需有找有多少个长度从1~n 的单词,满足最长连续元音少于A个并且最长连续辅音长度少于B. ...
- xshell如何让窗口并列排序
如图所示:
- php环境的安装
一.xampp的安装 1.下载xampp安装包. 2.next下一步傻瓜式的安装. 3.输入地址127.0.0.1进入如下页面. 二.LAMP环境的安装
- 洛谷 P1722 矩阵 II
题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(usqwedf:这不是一个2 ...
- 【C++ STL】Queue
1.定义 class queue<>实作为一个queue(也成为FIFO,先进先出).可以使用push()将任意数量的元素置入queue中,也可以使用pop()将元素以其插入顺序从容器中移 ...
- Proxmap Sort
这个排序是桶排序和基数排序的改进,理解了前两者,这个排序很容易理解 先回忆下桶排序是怎么回事,它与桶的区别在于入桶规则,桶排序里是1入1号桶,2入2号桶 这个排序把数字分区了,然后给出一个所谓的键,例 ...
- gdoi2017
今年的gdoi第一天t1大水题一道 裸的kmp 但是 我把记录长度的int数组开成了char类型 正解变爆零 心态爆炸......... 后面的第二题两千字题目以及五千字附加故事(我是没有去看,据说全 ...
- vue实现微信对话
因为项目中需要实现仿微信对话功能,于是抽空实现了下,主要是h5的canvas的把图片和文字绘制到画布上 原文来自我的个人博客:http://lvhww.com/index.php/archives/6 ...
- POJ1014(多重背包)
Dividing Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65044 Accepted: 16884 Descri ...