<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> function Person(){ } /**
* 使用如下犯法来编写代码,当属性和方法特别多的时候,编写起来不是很方便,
* 可以通过json的格式 Person.prototype.name = "Leon";
Person.prototype.age = 23;
Person.prototype.say = function(){
console.info(this.name + " " + this.age);
}
*/
/**
* 以下方式将会重写原型
* 由于原型重写,而且没有通过Person.propotype来指定,
* 此时的constructor不会指向Person而是指向Object,
* 如果constructor真的比较重要,可以在json中说明原型的指向constructor : Person ,
*/
Person.prototype = {
// constructor : Person ,//手动指定constructor
name : "Leon",
age : 23,
say : function(){
console.info(this.name + " , " + this.age);
}
} var p1 = new Person();
p1.say(); //Leon , 23
console.info(p1.constructor == Person); //false 如果取消注释掉的constructor : Person , 此时结果为true
console.info(p1.constructor); // Object() 如果取消注释掉的constructor : Person , 此时结果为Person() </script> </head>
<body> </body>
</html>
 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> function Person(){ } var p1 = new Person(); Person.prototype.sayHi = function(){
console.info(this.name + " : hi ");
for(var o in Person.prototype){
console.info(o);
}
}
p1.sayHi(); //undefined : hi sayHi /**
* 如果把重写放置在new Person()之后,注意内存模型
*/
Person.prototype = {
// constructor : Person ,//手动指定constructor
name : "Leon",
age : 23,
say : function(){
console.info(this.name + " , " + this.age);
}
}
p1.sayHi();////undefined : hi name age say var p2 = new Person();
p1.say(); //TypeError: p1.say is not a function
p2.say(); //Leon , 23
p2.sayHi(); //TypeError: p2.sayHi is not a function </script> </head>
<body> </body>
</html>

但又存在另外一种问题:

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> /**
* 基于原型的创建虽然可以有效的完成封装,但是依然有一些问题
* 1 无法通过构造函数来设置属性值
* 2 当属性中的引用类型变量是可能存在变量值重复
*/
function Person(){ }
Person.prototype = {
constructor : Person,
name : "Leon" ,
age : 30 ,
friends : ["Ada","Chris"],
say : function(){
console.info(this.name + "[" + this.friends + "]");
}
} var p1 = new Person();
p1.name = "Jhon";
p1.say(); //Jhon[Ada,Chris] console.info(p1.__proto__);
/**
* 输出结果:
* age 30
* friends ["Ada", "Chris", "Mike"]
* name "Leon"
* constructor Person()
* say function()
*/ var p2 = new Person();
p2.say(); //Leon[Ada,Chris] //会在原型中找friends,所有Mike是在原型中增加的
p1.friends.push("Mike"); //为p1增加了一个朋友
//此时原型汇总就多了一个mike,这就是原型带来的第二个问题
p1.say(); //Jhon[Ada,Chris,Mike]
p2.say(); //Leon[Ada,Chris,Mike]
console.info(p1.__proto__);
console.info(p2.__proto__);
/**
* 输出结果:
* age 30
* friends ["Ada", "Chris", "Mike"]
* name "Leon"
* constructor Person()
* say function()
*/ </script> </head>
<body> </body>
</html>

js 原型模型重写1的更多相关文章

  1. JS面向对象——动态原型模型、寄生构造模型

    动态原型模型 组合使用构造函数模型和原型模型,使得OO语言程序员在看到独立的构造函数和原型时很困惑.动态原型模型致力于解决该问题,它把所有的信息封装在构造函数中,通过在构造函数中初始化原型(仅在必要情 ...

  2. JS面向对象——组合使用构造函数模型与原型模型中的隐患

    组合使用构造函数模型和原型模型中的问题,使用对象字面量重写原型模型会有隐患(涉及到原型的动态性),如下例: <!DOCTYPE html> <html> <head> ...

  3. JS面向对象——组合使用构造函数模型与原型模型

    该模型为创建自定义类型最常用的方式. <!DOCTYPE html> <html> <head> <title>组合使用构造函数模型和原型模型</ ...

  4. JS面向对象——原型模型

    以下通过一段示例代码,说明原型模型中的基本概念以及知识点. <!DOCTYPE html> <html> <head> <title>原型模型</ ...

  5. JS原型-语法甘露

    初看原型 JS的所有函数都有一个prototype属性,这个prototype属性本身又是一个object类型的对象. prototype提供了一群同类对象共享属性和方法的机制. 将一个基类的实例作为 ...

  6. JS原型,Prototype,原型

    对于javascript这样一种前端语言,个人觉得,要真正的理解其oop, 就必须要彻底搞清楚javascript的对象,原型链,作用域,闭包,以及this所引用的对象等概念.这些对弄明白了,应该就可 ...

  7. js原型浅谈理解

    之前在学习原型(prototype)的时候,一直对原型的理解不是很清晰,只是知道每个对象都有一个原型,然后在js中万物又皆对象.在这里谈一下自己对于js原型的简单理解吧. 原型可以实现属性和方法的共享 ...

  8. JS 原型链图形详解

    JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...

  9. Java设计模式(三)原型模型 适配器型号

    (五岁以下儿童)原型模型 Prototype 样机模型旨在复制一个现有对象来创建新对象.而不是通过的方式的实例.原型模式须要实现 Cloneable 接口.覆写clone方法,复制分为浅复制.深复制. ...

随机推荐

  1. 【转】 IOS 项目配置--构建输出DIR

    原文网址:http://blog.csdn.net/fengsh998/article/details/8868871 通常在情一般都不建议使用绝对路径,因为写死之后,换环境,换平台,又要重新修改路径 ...

  2. App中嵌入网页浏览器

    TOWebViewController 插件 NSURL *url =[NSURL URLWithString:@"http://192.168.1.134:8180/Home/IndexP ...

  3. xampp无法打开phpmyadmin解决方案

    如果设置了apache的端口号(如8890),那么不可以用自带的admin按钮打开,而是要加上端口(如localhost:8890/phpmyadmin/)

  4. 简单的聊天程序,主要用到的是Socket

    服务端: import java.io.*; import java.net.*; import java.util.*; public class ChatServer { boolean stat ...

  5. SQL注入常用语句

    整形参数判断     1.直接加'  2.and 1=1  3. and 1=2     如果1.3运行异常 2正常就存在注入 字符型判断     1.直接加'  2.and '1'='1'  3. ...

  6. 8、NFC技术:让Android自动打开网页

    创建封装Uri的NdefRecord  public  NdefRecord  createUri(String  uriString);  public  NdefRecord  cre ...

  7. go 应用程序性能测试

    runtime/pprof 我们要加入对pprof包里的方法调用,程序才能将运行时候程序的堆内存分配状态记录到文件(也可以是写到其他地方,例如网络等)中,以便进一步的分析. 如果你的go程序只是一个应 ...

  8. 代理抓取RSS信息

    最近工作很闲,就自己写了一个可以看RSS订阅的网站.话说,RSS阅读器到处都是,随便下一个就可以了,为什么还去做一个网站形式的呢?作为一个热(xian)爱(de)前(dan)端(teng)的程序员,我 ...

  9. Solaris系统管理(二)资源管理与网络配置

    上一篇主要总结了Solaris安装后需要进行的一些设置,如ssh,pkgutil管理依赖,vim安装. 这一篇将会对Solaris资源管理与网络配置进行总结. 四 Solaris 系统管理 1,查询总 ...

  10. PHP 转义详解

    php中数据的魔法引用函数 magic_quotes_gpc  或 magic_quotes_runtime 设置为on时,为我们引用的数据碰到 单引号' 和 双引号" 以及 反斜线\ 时自 ...