构造函数、原型对象、构造器是一体的关系,同时产生;

实例中的隐藏属性__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高级程序设计之原型对象的更多相关文章

  1. 读javascript高级程序设计05-面向对象之创建对象

    1.工厂模式 工厂模式是一种常用的创建对象的模式,可以使用以下函数封装创建对象的细节: function CreatePerson(name,age){ var p=new Object(); p.n ...

  2. 读javascript高级程序设计06-面向对象之继承

    原型链是实现继承的主要方法,通过原型能让一个引用类型继承另一个引用类型. 1.原型链实现继承 function SuperType(){ this.superprop=1; } SuperType.p ...

  3. JavaScript高级程序设计之location对象

    location对象用来处理URL的相关信息 1.获取查询字符串 // 获取查询字符串对象 var getQueryStringArgs = function () { ? location.sear ...

  4. JavaScript高级程序设计之window对象

    在浏览器中window对象实现了JavaScript中的Global对象: window对象是最顶层的对象: 所有其他全局的东西都可以通过它的属性检索到. ; window.aa = ; // 所有全 ...

  5. 读javascript高级程序设计00-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  6. 读javascript高级程序设计-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  7. 《Javascript高级程序设计》读书笔记之对象创建

    <javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...

  8. 阅读摘录《javascript 高级程序设计》01

    前言: 因为工作需要,所以开始主攻前台JS方面的技术.在以前的工作中,使用过这门脚本语言.但是都是比较凌乱的,用到什么学什么,只是为了实现业务,而去使用. 不会考虑到代码优化,封装对象等.今次特意借了 ...

  9. 《JavaScript高级程序设计》学习笔记(5)——面向对象编程

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...

随机推荐

  1. VB 读取csv文件数据

    Public adoConn As New ADODB.Connection Private Sub csv() adoConn.ConnectionString = "Driver={Mi ...

  2. 覆盖原有div或者Input的鼠标移上去描述

    <input  onmouseover="this.title='我是描述内容'" />

  3. 构造一个简单的linux系统

    1.搭建环境 cd ~/Work/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz xz -d linux- ...

  4. windows 服务的启动与安装

    在使用windows 操作系统时,我们对windows服务再也熟悉不过了,这些服务有的是系统层的,有的是应用层的,大部分都是运行在桌面的后台,可以在进程中看到,有时候在做web项目时,在站点启动时要启 ...

  5. UVa11210 中国麻将 Chinese Mahjong-搜索

    https://vjudge.net/problem/UVA-11210 //被水题虐了一上午... #include<iostream> #include<cstdio> # ...

  6. 洛谷P2729 饲料调配 Feed Ratios

    P2729 饲料调配 Feed Ratios 36通过 103提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 农夫约翰从来只用调 ...

  7. IoGetDeviceObjectPointer .

    从名字获得设备对象 驱动的起始地址,大小等信息.

  8. No valid host was found. There are not enough hosts available

  9. 新写的c++日志库:log4K

    网是开源的c/c++日志库也不少,但用起来总觉得不方便,于是动手写了一个C++日志框架Log4K. 测试代码: #include "log4k.h" #pragma comment ...

  10. SID与GUID的区别

    1.在AD里面创建一个用户或者组都会为其分配一个SID,同时也会为这些对象分配一个GUID,GUID是一个128位的字符串,一个标识符,GUID不仅在整个域里面是唯一的,并且在全世界的范围内都是唯一的 ...