<!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 解决原型问题的方案 : 构造器和原型的组合的更多相关文章

  1. 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)

    摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...

  2. js---12对象创建方式,构造器,原型

    <script type="text/javascript"> var o = {}; var o1 = new Object();//这2种方式创建对象是一样的,因为 ...

  3. Spirit带你彻底搞懂JS的6种继承方案

    JavaScript中实现继承的6种方案 01-原型链的继承方案 function Person(){ this.name="czx"; } function Student(){ ...

  4. JavaScript简单重写构造器的原型

    //简单重写原型对象: //一个构造函数Person function Person(){ } //重写Person的原型 //把Person的原型赋值给一个新的对象 是我们重写的过程 Person. ...

  5. JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

    什么是面向对象?面向对象是一种思想. 面向对象可以把程序中的关键模块都视为对象, 而模块拥有属性及方法. 这样如果我们把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.   工厂 ...

  6. JavaScript (JS) 面向对象编程 浅析 (含对象、函数原型链、闭包解析)

    1. 构造函数原型对象:prototype ① 构造函数独立创建对象,消耗性能 function Person(name) { this.name = name; this.sayHello = fu ...

  7. JS面向对象(1)——构造函数模式和原型模式

    1.构造函数模式 构造函数用来创建特定的类型的对象.如下所示: function Person(name,age,job){ this.name=name; this.job=job; this.ag ...

  8. js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态)

    js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态) 一.总结 1.js函数中的private和public:js函数中的私有变量 var 变量名,公有变量 this. ...

  9. 搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理

    什么是跨域 跨域:一个域下的文档或脚本试图去请求另一个域下的资源 广义的跨域包含一下内容: 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源请求(内部的引用,脚本script,图片img,fr ...

  10. HTML5 respond.js 解决IE6~8的响应式布局问题

    HTML5 respond.js 解决IE6~8的响应式布局问题   响 应式布局,理想状态是,对PC/移动各种终端进行响应.媒体查询的支持程度是IE9+以及其他现代的浏览器,但是IE8在市场当中仍然 ...

随机推荐

  1. ArcEngine下投影坐标和经纬度坐标的相互转换

    jojojojo2002 原文 ArcEngine下投影坐标和经纬度坐标的相互转换 投影转经纬度 private IPoint PRJtoGCS( double x, double y) { IPoi ...

  2. linux清空日志文件内容 (转)

    随着系统运行时间越来越长,日志文件的大小也会随之变得越来越大.如果长期让这些历史日志保存在系统中,将会占用大量的磁盘空间.用户可以直接把这些日志文件删除,但删除日志文件可能会造成一些意想不到的后果.为 ...

  3. Yii 显示错误信息(Fatal Error,Warning)在页面上

    Yii由于设计上对于一些php奇怪问题的顾虑,并没有像cake,kohana一样把php错误信息打印在页面上. 遇到错误时,只是显示白页,这让没有经验的programmer会一头雾水. 实际上通常vh ...

  4. selenium python (四)键盘事件

    #!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #在实际测试过程中,有时候我们需要使用tab键将焦点转移到下一个需要操作 ...

  5. linux笔记_20150825_linux下的软件工具唠叨下

    这些都是书上看到的,有些工具我也没有完全用过.先记下来再说.闲着也是闲着. 1.linux下常见的语言及编程环境:c/c++/java/perl/fortan等. 2.图形环境:gnome/kde/g ...

  6. JavaScript 教程学习进度备忘(二)

    备忘:之前,只将“JS 教程”学习完毕,这篇记录:“JS HTML DOM ”.“JS 对象”.“JS Window”.“JS 库” 书签:跳过:另外跳过的内容有待跟进 _______________ ...

  7. bzoj 1806 [Ioi2007]Miners 矿工配餐(DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1806 [题意] 给定一个权在1..3内的序列,在保持相对位置不变的情况下拆分成两个序列 ...

  8. SAS、R以及SPSS的比较__统计语言大战

  9. ps教程-三分钟画齿轮

  10. 刚刚大学毕业,自己搭网站遇到的问题 一:tomcat中同时部署两个项目的问题

    最近直接把两个项目打成war包在tomcat下发布,出现了很多莫名奇妙的问题,就是不能发布成功,只能有一个项目能成功,在网上查了很多方法,以为是两个项目中jar包出现冲突,也按照网上的方法把两个项目中 ...