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 ...
随机推荐
- 【神仙DP】【UVa11400】Lighting System Design
传送门 Description Translation 题目大意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯泡只需要共享一个 ...
- AtCoder Grand Contest 031 B - Reversi(DP)
B - Reversi 题目链接:https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: 给出n个数,然后现在你可以对一段区间修改成相同的值,前提是 ...
- springmvc不通过controller进行页面跳转
1.controller 继承WebMvcConfigureAdapter 然后使用ViewControllerRegistry 来进行跳转
- 000 Python常识与快捷键(未完)
1.Python控制台IDLE的快捷键 Alt + N :返回开始输入的第一条语句 Alt + P :返回刚刚输入的上一条语句 Tab:制表符,用于缩进或补全内容,是Python语法格式的灵魂,作用涵 ...
- HDU1531 差分约束
King Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- [LeetCode] 12. Integer to Roman ☆☆
Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...
- 【设计模式】 模式PK:观察者模式VS责任链模式
1.概述 为什么要把观察者模式和责任链模式放在一起对比呢?看起来这两个模式没有太多的相似性,真没有吗?回答是有.我们在观察者模式中也提到了触发链(也叫做观察者链)的问题,一个具体的角色既可以是观察者, ...
- Linux局域网内文件传送
先安装ssh服务 sudo apt-get install ssh 普通传输文件,可以使用scp命令 1.将本地文件复制到目标机器: scp 文件名 用户名@目标机器IP:目标机器路径 回车后输入密 ...
- jsp04状态管理
1.http 协议的无状态性 无状态是指,当浏览器发送请求给服务器的时候,服务器会响应.但当同一个浏览器再次发送请求时,服务器不会知道是刚才那个浏览器. 简单说,服务器[不会保存用户状态],不会记得客 ...
- 【NOIP】2013提高组 花匠(摆花)
[算法]DP||贪心 [题解] (1)动态规划: 令f[i][0..1]为两种条件下前i株花的最大保留数量,状态转移方程: f[i][0]=max(f[j][1]+1) (j=i-1...1)(h[i ...