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 ...
随机推荐
- python获取当前工作目录
py文件所在位置/test/pj/hello.py 用户所在位置:/ 用户执行命令python /test/pj/hello.py 1. os.getcwd() 返回的是执行命令的位置 / 2.sys ...
- 一些实用的JQuery代码片段收集
本文将展示50个非常实用的JQuery代码片段,这些代码能够给你的JavaScript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够 ...
- 解决requests获取源代码时中文乱码问题
用requests获取源代码时,如果是中文网页,就可能会出现乱码,下面我以中关村的网站为例: import requests url = 'http://desk.zol.com.cn/meinv/' ...
- [codeforces/edu31]总结
链接:http://codeforces.com/contest/884 A题: 求86400-ai的前缀和,找到第一个大于等于给定t的即可. B题: 任意相邻两段之间必然有一个0,然后算一下至少的长 ...
- ACM1258邻接表
教训:使用邻接表的时候一定要把邻接表的结构组定义的足够大,不能仅仅等于节点的个数,因为线段的数量往往远超过节点的数量. 这个题目是拓扑排序练习,提高下理解. #include<iostream& ...
- [异常处理]class kafka.common.UnknownTopicOrPartitionException (kafka.server.ReplicaFetcherThread)
在kafka.out日志里出现大量 ERROR [ReplicaFetcherThread-0-1], Error for partition [FLAG_DATA_SYC,1] to broker ...
- 【BZOJ】1202: [HNOI2005]狡猾的商人
[题意]w组数据,给定n和m,给出m段区间[s,t](1<=s<=t<=n)的数字和,求是否矛盾.n<100,m<1000,w<100. [算法]带权并查集 [题解 ...
- Go从入门到精通(持续更新)
1.0 搭建环境 由于我们 Go官方网站 在我大天朝被和谐了,所以我们只能去 Go语言中文网 来下载了.Go的安装很简单,不像Java还要配置一大堆的东西,选择自己系统的对应版本,下载安装,像安装QQ ...
- 最短路之spfa系列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t ...
- 转一篇sublime必备的一些插件
Package Control 功能:安装包管理 简介:sublime插件控制台,提供添加.删除.禁用.查找插件等功能 使用:https://sublime.wbond.net/installatio ...