js 解决原型问题的方案 : 构造器和原型的组合
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> /**
* 为了解决原型带来的所有问题,此时需要通过组合构造函数和原型来实现对象的创建
* 将属性在构造函数中定义,将方法在原型中定义
* 这种有效集合了两者的有点,是目前最为有效的一种方式
* @constructor
*/
function Person(name , age , friends){ this.name = name;
this.age = age;
this.friends = friends;
}
Person.prototype = {
constructor : Person,
//方法在原型中定义
say : function(){
console.info(this.name + "[" + this.friends + "]");
}
}
//此时所有的属性都保存在自己的空间
var p1 = new Person("leon" , 23 , ["Ada" , "Chris"]);
p1.name = "John";
p1.say(); //John[Ada,Chris]
p1.friends.push("Mike");
p1.say(); //John[Ada,Chris,Mike]
var p2 = new Person("Ada" , 33 , ["Leon"]); p2.say();//Ada[Leon] </script> </head>
<body> </body>
</html>
为了让定义的方法更加符合java的写法,如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> /**
* 为了让定义的方式更加符合java的需求,就需要把定义方法的原型代码放置到Person这个构造函数中
*/
function Person(name , age , friends){ //属性在构造器中定义
this.name = name;
this.age = age;
this.friends = friends;
/**
* 不能使用重写的方式定义
* Person.prototype = {
constructor : Person,
//方法在原型中定义
say : function(){
console.info(this.name + "[" + this.friends + "]");
}
}
*/ console.info(Person.prototype.say); //undefined
//每次new一个对象 将再次定义该方法
Person.prototype.say = function(){
console.info(this.name + "[" + this.friends + "]");
}
console.info(Person.prototype.say); //function()
/**
* 解决每次创建对象将再次定义该方法的方案:
* 判断Person.prototype.say是否凑在,如果不存在就标识创建,
* 当存在之后就不再创建
*/
if(!Person.prototype.say){
Person.prototype.say = function(){
console.info(this.name + "[" + this.friends + "]");
}
} } //此时所有的属性都保存在自己的空间
var p1 = new Person("leon" , 23 , ["Ada" , "Chris"]);
p1.name = "John";
p1.say(); //John[Ada,Chris]
p1.friends.push("Mike");
p1.say(); //John[Ada,Chris,Mike]
var p2 = new Person("Ada" , 33 , ["Leon"]); p2.say();//Ada[Leon] </script> </head>
<body> </body>
</html>
js 解决原型问题的方案 : 构造器和原型的组合的更多相关文章
- 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)
摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...
- js---12对象创建方式,构造器,原型
<script type="text/javascript"> var o = {}; var o1 = new Object();//这2种方式创建对象是一样的,因为 ...
- Spirit带你彻底搞懂JS的6种继承方案
JavaScript中实现继承的6种方案 01-原型链的继承方案 function Person(){ this.name="czx"; } function Student(){ ...
- JavaScript简单重写构造器的原型
//简单重写原型对象: //一个构造函数Person function Person(){ } //重写Person的原型 //把Person的原型赋值给一个新的对象 是我们重写的过程 Person. ...
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
什么是面向对象?面向对象是一种思想. 面向对象可以把程序中的关键模块都视为对象, 而模块拥有属性及方法. 这样如果我们把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作. 工厂 ...
- JavaScript (JS) 面向对象编程 浅析 (含对象、函数原型链、闭包解析)
1. 构造函数原型对象:prototype ① 构造函数独立创建对象,消耗性能 function Person(name) { this.name = name; this.sayHello = fu ...
- JS面向对象(1)——构造函数模式和原型模式
1.构造函数模式 构造函数用来创建特定的类型的对象.如下所示: function Person(name,age,job){ this.name=name; this.job=job; this.ag ...
- js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态)
js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态) 一.总结 1.js函数中的private和public:js函数中的私有变量 var 变量名,公有变量 this. ...
- 搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理
什么是跨域 跨域:一个域下的文档或脚本试图去请求另一个域下的资源 广义的跨域包含一下内容: 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源请求(内部的引用,脚本script,图片img,fr ...
- HTML5 respond.js 解决IE6~8的响应式布局问题
HTML5 respond.js 解决IE6~8的响应式布局问题 响 应式布局,理想状态是,对PC/移动各种终端进行响应.媒体查询的支持程度是IE9+以及其他现代的浏览器,但是IE8在市场当中仍然 ...
随机推荐
- svn sc create 命令行创建服务自启动
今天重装了系统,Subversion服务也得重装.照例输入代码: sc create svnserve binpath="d:\PortableApps\svn\svnserve.exe - ...
- Web 通信 之 长连接、长轮询(long polling)(转)
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...
- Python 中的 is 和 id
(ob1 is ob2) 等价于 (id(ob1) == id(ob2)) 首先id函数可以获得对象的内存地址,如果两个对象的内存地址是一样的,那么这两个对象肯定是一个对象.和is是等价的.Pytho ...
- Careerup上的简历模板
So this is what a GOOD resume look like http://www.careercup.com/resume (需FQ)
- Windows字符集的统一与转换
以前也零零散散看过一些字符编码的问题,今天看来这边博客,感觉很多东西都总结在里面,非常值得学习! 一.字符集的历史渊源 在Windows编程时经常会遇到编码转换的问题,一直以来让刚接触的人摸不着头脑. ...
- effective c++:对象的赋值运算
operator 中处理”自我赋值“ operator=操作符缺省情况下返回引用——TYPE& TYPE::operator=(const TYPE&),原因很简单,operator= ...
- win7中protel99添加元件库
protel打开时默认添加Miscellaneous Devices.lib,点击ADD/REMOVE按钮添加所需要的库时,弹出“文件无法识别”. 点击面板右下方“FIND”按钮,弹出如下对话框时不要 ...
- Page Scroll Menu (页面中锚点菜单)
Technorati 标签: Page Scroll Menu,页面锚点菜单,Menu,Too Long,页面太长 当页面太长时,会导致浏览不便,这时就需要一个页面锚点菜单(Page Scroll ...
- LeetCode(4) - Median of Two Sorted Arrays
题目要求很简单,就是给你两个已经排好序的数组nums1(长度为m)和nums2(长度为n),找出他们的中间值.返回值类型double是因为如果数字个数是偶数个,就要返回中间两个数的平均值.这题最简单的 ...
- 第三百三十二天 how can I 坚持
今天一大早,住的这就施工了,被吵醒了.. 下午去了趟小米之家,小米5还行,黑科技不黑,哈哈. 小米5黑科技不太黑,就知道造词,整体感觉还行,就是感觉屏幕有点长,小米之家人倒是不少,还有老太太去小米之家 ...