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 ...
随机推荐
- .net重启iis线程池和iis站点程序代码【转】
转:http://www.jb51.net/article/44162.htm 重启站点: 复制代码代码如下: /// <summary> /// 根据名字重启站点.(没重 ...
- MSP430F149学习之路——按键与LED
代码 /*********************************** 程序功能:用按键控制LED状态 缺点:按键按下后无法改变LED灯的状态,可以利用板上的复位键^~^ ********** ...
- linux C中va_list用法
#include <stdio.h> #include <stdarg.h> int demo( int, ... ); int main( void ) { demo(1, ...
- css透明属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- css的border效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- dedecms 文章页调用来源合适时间的方法
时间: 一:{dede:field.pubdate function="MyDate('Y-m-d H:i',@me)"/} 二:{dede:field name='pubdate ...
- RGB颜色空间与YCbCr颜色空间的互转
在人脸检测中会用到YCbCr颜色空间,因此就要进行RGB与YCbCr颜色空间的转换.在下面的公式中RGB和YCbCr各分量的值的范围均为0-255. RGB转到YCbCr: float y= (col ...
- hdu1864
use the cnt as the limit. #include <string.h> #include <stdio.h> ],sum; ]; double a,b,c; ...
- linux安装ftp服务器
Ftp(文件传输协议) 概念 FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用 ...
- RocketMQ学习记录
RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: 1.能够保证严格的消息顺序 2.提供丰富的消息拉取模式 3.高效的订阅者水平扩展能力 4.实时的消息订阅机制 5.亿级消息堆积能力 ...