JavaScript高级程序设计之原型对象
构造函数、原型对象、构造器是一体的关系,同时产生;
实例中的隐藏属性__proto__指向原型对象;
原型对象是这四种关系的纽带。
原型对象是动态的,不论在何处变化,实例中可以立即体现出来。
var Person = function(name) {
this.name = name;
};
var p1 = new Person("Nicholas");
Person.prototype.say = function() {
console.log(this.name);
};
/*
* 原型对象具有动态性
* 不论在何处添加的属性,可以立即在实例中调用
*/
p1.say(); // Nicholas
/*
* 有构造函数必有原型对象
* 有原型对象,其中必有构造器属性
* 原型对象中的特殊属性构造器指向构造函数本身
*/
console.log(Person.prototype.constructor === Person); // true
/*
* 实例中的原型属性指向构造函数的原型对象
* 实例中的指针仅指向原型对象,而不指向构造函数
*/
console.log(p1.__proto__ === Person.prototype); // true
重写整个原型会使其失去动态性,丢失构造器
var Person = function(name) {
this.name = name;
};
/*
* 这种写法使原型不再具有动态性
* 且丢失了Person.prototype.constructor
*/
Person.prototype = {
say: function() {
console.log(this.name);
}
};
// 实例必须在原型对象声明之后才能调用原型中的方法
var p1 = new Person("Nicholas");
p1.say(); // Nicholas
console.log(Person.prototype.constructor === Person); // false
console.log(p1.__proto__ === Person.prototype); // true
Douglas Object.create
// Douglas Object.create 这是基于原型的继承
if (typeof Object.create !== "function") {
Object.create = function (obj) {
var F = function () {};
F.prototype = obj;
return new F();
};
} var person = {
name: "lily",
friends: ["poly", "lucy"]
}; // 整个person对象成为了person2的原型对象
var person2 = Object.create(person); person2.name = "Lilei";
// 修改了原型对象,也既是person对象
person2.friends.push("Hanmeimei"); console.log(person.friends); // ["poly", "lucy", "Hanmeimei"]
JavaScript高级程序设计之原型对象的更多相关文章
- 读javascript高级程序设计05-面向对象之创建对象
1.工厂模式 工厂模式是一种常用的创建对象的模式,可以使用以下函数封装创建对象的细节: function CreatePerson(name,age){ var p=new Object(); p.n ...
- 读javascript高级程序设计06-面向对象之继承
原型链是实现继承的主要方法,通过原型能让一个引用类型继承另一个引用类型. 1.原型链实现继承 function SuperType(){ this.superprop=1; } SuperType.p ...
- JavaScript高级程序设计之location对象
location对象用来处理URL的相关信息 1.获取查询字符串 // 获取查询字符串对象 var getQueryStringArgs = function () { ? location.sear ...
- JavaScript高级程序设计之window对象
在浏览器中window对象实现了JavaScript中的Global对象: window对象是最顶层的对象: 所有其他全局的东西都可以通过它的属性检索到. ; window.aa = ; // 所有全 ...
- 读javascript高级程序设计00-目录
javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...
- 读javascript高级程序设计-目录
javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...
- 《Javascript高级程序设计》读书笔记之对象创建
<javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...
- 阅读摘录《javascript 高级程序设计》01
前言: 因为工作需要,所以开始主攻前台JS方面的技术.在以前的工作中,使用过这门脚本语言.但是都是比较凌乱的,用到什么学什么,只是为了实现业务,而去使用. 不会考虑到代码优化,封装对象等.今次特意借了 ...
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...
随机推荐
- JS获取当前文件所在的文件夹全路径
var js = document.scripts; js = js[js.length - 1].src.substring(0, js[js.length - 1].src.lastIndexOf ...
- 《App研发录》知识点汇总
原文链接:http://www.jianshu.com/p/fc8c4638937e <App研发录>这部书是包建强写的,说来也巧,在读这边书之前在看池建强的<Mac 人生元编程&g ...
- Android内存泄漏分析
周末去上海参加了安卓巴士组织的技术论坛,去了才发现自己基础很渣..... 其中提到了android的内存泄漏的问题,回来马上度娘(虽说度娘很渣),整理如下: 一.单例造成的内存泄漏 因为单例的静态特性 ...
- svn服务端配置
1.建立版本库 创建一个新的Subversion项目svnadmin create /var/www/svndata/njlrxx 配置允许用户jiqing访问cd /var/www/svndata/ ...
- Solaris磁盘设备
Solaris的磁盘分区称为分片(slice),在磁盘上,一个环形就是一个分区分片的命名通常是c#t#d#s#c:Controller number,控制器标号,c0就是第一个控制器t:Taget n ...
- C++多态性——函数的覆盖和隐藏
1.函数的覆盖 覆盖的条件: 基类函数必须是虚函数(使用Virtual关键字进行声明): 发生覆盖的两个函数必须分别位于派生类和基类中: 函数名称与参数列表必须完全一样: 2.函数的隐藏 隐藏,是指派 ...
- C puzzles详解【34-37题】
第三十四题 The following times. But you can notice that, it doesn't work. #include <stdio.h> int ma ...
- Linux多线程编程阅读链接
1. 进程与线程的一个简单解释(阮一峰) 2. linux 多线程编程 3. Linux 的多线程编程的高效开发经验 (IBM)
- 浅谈JavaScript中的string拥有方法的原因
我们都知道,JavaScript数据类型分两大类,基本类型(或者称原始类型)和引用类型. 基本类型的值是保存在栈内存中的简单数据段,它们是按值访问的.JS中有五种基本类型:Undefined.Null ...
- ASP.NET常用代码汇总
1. 打开新的窗口并传送参数: 传送参数:response.write("<script>window.open('*.aspx?id="+this.DropDownL ...