从面试题学习Javascript 面向对象(创建对象)


Posted in Javascript onMarch 30, 2012

题目:

try{ 
var me = Man({ fullname: "小红" }); 
var she = new Man({ fullname: "小红" }); 
console.group(); 
console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender")); 
console.groupEnd(); 
/*------[执行结果]------ 
我的名字是:小红 
我的性别是:<用户未输入> 
------------------*/ 
me.attr("fullname", "小明"); 
me.attr("gender", "男"); 
me.fullname = "废柴"; 
me.gender = "人妖"; 
she.attr("gender", "女"); 
console.group(); 
console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender")); 
console.groupEnd(); 
/*------[执行结果]------ 
我的名字是:小明 
我的性别是:男 
------------------*/ 
console.group(); 
console.info("我的名字是:" + she.attr("fullname") + "\n我的性别是:" + she.attr("gender")); 
console.groupEnd(); 
/*------[执行结果]------ 
我的名字是:小红 
我的性别是:女 
------------------*/ 
me.attr({ 
"words-limit": 3, 
"words-emote": "微笑" 
}); 
me.words("我喜欢看视频。"); 
me.words("我们的办公室太漂亮了。"); 
me.words("视频里美女真多!"); 
me.words("我平时都看优酷!"); 
console.group(); 
console.log(me.say()); 
/*------[执行结果]------ 
小明微笑:"我喜欢看视频。我们的办公室太漂亮了。视频里美女真多!" 
------------------*/ 
me.attr({ 
"words-limit": 2, 
"words-emote": "喊" 
}); 
console.log(me.say()); 
console.groupEnd(); 
/*------[执行结果]------ 
小明喊:"我喜欢看视频。我们的办公室太漂亮了。" 
------------------*/ 
}catch(e){ 
console.error("执行出错,错误信息: " + e); 
}

知识点:
(1)JS面向对象基础:ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数”。
(2)JS创建对象的方法:

(a)工厂模式:用函数来封装以特定接口创建对象的细节。

function createPerson(name, age, job){

var o = new Object();

o.name = name;

o.age = age;

o.job = job;

o.sayName = function(){

alert(this.name);

};

return o;

}

var person1 = createPerson(“Nicholas”, 29, “Software Engineer”);

var person2 = createPerson(“Greg”, 27, “Doctor”);

缺点:工厂模式虽然解决了创建多个相识对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。

(b)构造函数模式:ECMAScript中的构造函数可以用来创建特定类型的对象。可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。

function Person(name, age, job){

this.name = name;

this.age = age;

this.job = job;

this.sayName = function(){

alert(this.name);

};

}

var person1 = new Person(“Nicholas”, 29, “Software Engineer”);

var person2 = new Person(“Greg”, 27, “Doctor”);

缺点:使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。不要忘了——ECMAScript中的函数是对象,因此每定义一个函数,

就是实例化一个对象。

(c)原型模式:我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型

的所有实例共享的属性和方法。使用原型对象的好处是可以让所有对象共享它包含的属性和方法

function Person(){

}

Person.prototype.name = “Nicholas”;

Person.prototype.age = 29;

Person.prototype.job = “Software Engineer”;

Person.prototype.sayName = function(){

alert(this.name);

};

var person1 = new Person();

person1.sayName(); //”Nicholas”

var person2 = new Person();

person2.sayName(); //”Nicholas”

alert(person1.sayName == person2.sayName); //true

缺点:原型中所有属性是被很多实例共享的,这种共享对于函数非常合适。但是对于引用类型值的属性来说,问题就比较突出了。

(d)组合使用构造函数模式和原型模式:创建自定义类型的最常见方式,就是使用组合使用构造函数模式和原型模式。构造函数模式用于定义实例属性,

而原型模式用于定义方法和共享的属性。

function Person(name, age, job){

this.name = name;

this.age = age;

this.job = job;

this.friends = [“Shelby”, “Court”];

}

Person.prototype = {

constructor: Person,

sayName : function () {

alert(this.name);

}

};

var person1 = new Person(“Nicholas”, 29, “Software Engineer”);

var person2 = new Person(“Greg”, 27, “Doctor”);

person1.friends.push(“Van”);

alert(person1.friends); //”Shelby,Court,Van”

alert(person2.friends); //”Shelby,Court”

alert(person1.friends === person2.friends); //false

alert(person1.sayName === person2.sayName); //true
答案:

<!DOCTYPE html> 
<html> 
<head> 
<style type="text/css" rel="stylesheet"> 
</style> 
<title></title> 
</head> 
<body> 
</body> 
<script type="text/javascript"> 
window.onload=function() 
{ 
var Man; 
//+++++++++++答题区域+++++++++++ 
Man=function(obj){ 
if(!(this instanceof Man)) 
{ 
return new Man(obj); 
} 
this.attrObj=obj||{}; 
this.wordsObj=[]; 
} 
Man.prototype={ 
constructor:Man, 
words:function(word){ 
word!=undefined&&this.wordsObj.push(word); 
}, 
attr:function(attribute,attributeValue) 
{ 
var defaultVaule="<用户未输入>"; 
if(arguments.length==2){ 
this.attrObj[attribute]=attributeValue; 
} 
else if(!(attribute instanceof Object)) 
{ 
if((this.attrObj[attribute]===undefined)) 
{ 
return defaultVaule; 
} 
else 
{ 
return this.attrObj[attribute]; 
} 
} 
else{ 
for(property in attribute) 
{ 
this.attrObj[property]=attribute[property]; 
} 
} 
}, 
say:function() 
{ 
var limit=this.attrObj['words-limit'], 
outputString, 
wordsLen=this.wordsObj.length; 
outputString=this.attr("fullname")+this.attr("words-emote")+":"; 
for(var i=0;i<limit;i++) 
{ 
outputString+=this.wordsObj[i]; 
} 
return outputString; 
} 
}; 
//+++++++++++答题结束+++++++++++ 
try{ 
var me = Man({ fullname: "小红" }); 
var she = new Man({ fullname: "小红" }); 
console.group(); 
console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender")); 
console.groupEnd(); 
/*------[执行结果]------ 
我的名字是:小红 
我的性别是:<用户未输入> 
------------------*/ 
me.attr("fullname", "小明"); 
me.attr("gender", "男"); 
me.fullname = "废柴"; 
me.gender = "人妖"; 
she.attr("gender", "女"); 
console.group(); 
console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender")); 
console.groupEnd(); 
/*------[执行结果]------ 
我的名字是:小明 
我的性别是:男 
------------------*/ 
console.group(); 
console.info("我的名字是:" + she.attr("fullname") + "\n我的性别是:" + she.attr("gender")); 
console.groupEnd(); 
/*------[执行结果]------ 
我的名字是:小红 
我的性别是:女 
------------------*/ 
me.attr({ 
"words-limit": 3, 
"words-emote": "微笑" 
}); 
me.words("我喜欢看视频。"); 
me.words("我们的办公室太漂亮了。"); 
me.words("视频里美女真多!"); 
me.words("我平时都看优酷!"); 
console.group(); 
console.log(me.say()); 
/*------[执行结果]------ 
小明微笑:"我喜欢看视频。我们的办公室太漂亮了。视频里美女真多!" 
------------------*/ 
me.attr({ 
"words-limit": 2, 
"words-emote": "喊" 
}); 
console.log(me.say()); 
console.groupEnd(); 
/*------[执行结果]------ 
小明喊:"我喜欢看视频。我们的办公室太漂亮了。" 
------------------*/ 
}catch(e){ 
console.error("执行出错,错误信息: " + e); 
} 
} 
</script> 
</html>

Javascript 相关文章推荐
script标签的 charset 属性使用说明
Dec 04 Javascript
利用jquery的获取JS文件中的字符串内容
Feb 14 Javascript
JavaScript中的Math 使用介绍
Apr 21 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
Jan 10 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
Mar 24 jQuery
jQuery用noConflict代替$的实现方法
Apr 12 jQuery
详解刷新页面vuex数据不消失和不跳转页面的解决
Jan 30 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
Sep 11 Javascript
Vue 中 a标签上href无法跳转的解决方式
Nov 12 Javascript
Vue获取页面元素的相对位置的方法示例
Feb 05 Javascript
Node.js API详解之 string_decoder用法实例分析
Apr 29 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
jQuery 自定义函数写法分享
Mar 30 #Javascript
一个JQuery操作Table的代码分享
Mar 30 #Javascript
javascript工具库代码
Mar 29 #Javascript
Web开发之JavaScript
Mar 29 #Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
Mar 29 #Javascript
javascript对talbe进行动态添加、删除、验证实现代码
Mar 29 #Javascript
jQuery 下拉列表 二级联动插件分享
Mar 29 #Javascript
You might like
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
greybox——不开新窗口看新的网页
2007/02/20 Javascript
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
Vue自定义指令详解
2017/07/28 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
让python json encode datetime类型
2010/12/28 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
Python如何将字符串转换为日期
2020/07/31 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
大学生两会精神学习心得体会
2014/03/10 职场文书
写给女朋友的保证书
2015/05/09 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
五年级语文教学反思
2016/03/03 职场文书
人民调解协议书
2016/03/21 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android