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在市场当中仍然 ...
随机推荐
- xsheell的下载安装初级使用
1)关于Xshell 网上更多的资料里提到的SSH客户端是putty,因为简单.开源.免费.但是也正是由于功能过于简单,所以在这里推荐大家使用Xshell. Xshell最初并不能免费使用,而且也没有 ...
- linux 下查看系统内存使用情况的方法
在Windows系统中查看内存的使用情况很简单,想必大家都已经耳熟能详了,那么在linux系统如何查看内存使用情况呢?下面和大家分享在Linux 下查看内存使用情况的free命令: [root@scs ...
- JAVA CAS原理、unsafe、AQS
concurrent包的实现 由于java的CAS同时具有 volatile 读和volatile写的内存语义,因此Java线程之间的通信现在有了下面四种方式: A线程写volatile变量,随后B线 ...
- 读取Assets中的文件数据
try { // 返回的字节流 InputStream is = getResources().getAssets().open("info.txt"); // 当读取时,属于文本 ...
- .net发邮件 附件文件名乱码
.net发邮件 附件文件名乱码,可以下载以下补丁安装. https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.asp ...
- 【PHP】linux搭建PHP运行环境
之前在windows下写了hello world,终归是不够用啊,因为开发环境是Linux,怎么办呢~~~学习学习再学习 写在前面的话:我从百度文库的一个文章里摘出来的,原文章名称<Linux下 ...
- activity切换时的overridePendingTransition动画效
注意,切换方法overridePendingTransition只能在startActivity和finish方法之后调用.第一个参数为第一个Activity离开时的动画,第二参数为所进入的Act ...
- while (cin>>str)退出死循环
今天在练习的时候突然发现了这个问题,百度之感觉还挺常见的,故记之! //题目描述 // //写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串. // //输入描述 : //输入一个 ...
- SandDock 应用示例
直接上代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...
- BFS寻路算法的实现
关于BFS的相关知识由于水平有限就不多说了,感兴趣的可以自己去wiki或者其他地方查阅资料. 这里大概说一下BFS寻路的思路,或者个人对BFS的理解: 大家知道Astar的一个显著特点是带有启发函数, ...