javascript之原型、原型链
function Person(){}
/*function fn(){}
console.dir(Person); // 以对象形式打印
console.dir(fn); */
// 给原型对象添加color属性
Person.prototype.color = "red";
Person.prototype.legs = 2;
// sayHi方法在内存中只有一份,在Person.prototype原型对象中
// 内存浪费问题
Person.prototype.sayHi = function () {
console.log("hello is me");
}
console.log( Person.prototype );
var p1 = new Person();
console.log(p1.color); // lime
p1.sayHi();
var p2 = new Person();
console.log(p2.legs); // 2
p2.sayHi();
// p1的sayHi和p2 的sayHi方法是同一个,地址是相同的
// 这个sayHi方法在 原型对象中
console.log(p1.sayHi == p2.sayHi); // true
// 构造函数
function Person(){}
// Person.prototype 原型对象
Person.prototype.color = "red";
Person.prototype.legs = 2;
Person.prototype.sayHi = function () {
console.log("hello is me");
}
// 实例对象
var p1 = new Person();
console.log(p1.color); // red
console.log(p1.legs); // 2
p1.sayHi();
// Person创建的实例
var p2 = new Person();
console.log( p2.color );
console.log( p2.legs );
p2.sayHi();
console.log(p1.sayHi === p2.sayHi);
三、__proto__属性
function Person(){}
var p = new Person();
console.log(p);
console.log( p.__proto__ ); // 原型对象
console.log( p.__proto__ == Person.prototype ); // true
// 推荐方式:
Person.prototype.color = "red";
console.log( Person.prototype );
四、constructor属性
function Person(){}
console.log( Person.prototype );
console.log( Person.prototype.constructor ); // Person
练习题:
function Person(){}
var p = new Person();
console.log( p.constructor == Person ); // true
// p Person的实例对象
// p.constructor ==> p实例对象去原型对象上拿到constructor属性去用的
// ==> Person
console.log( p.constructor == Person.prototype.constructor ); // true
// Person.prototype.constructor ==> Person
// p.constructor ==> Person
五、原型链
// 问题:
function Person(){}
var p = new Person();
// 问:p实例对象去调用toString方法,这个toString方法在哪?
console.log( p.toString() );
// 原型链:对象有 __proto__ 属性, 指向了当前的原型对象,原型对象也是对象,原型对象有__proto__属性,指向了原型对象的原型对象,这样一环套一环形成的链式结构,叫做原型链。
// 形象理解: 孩子有自己的爸爸,自己的爸爸也有爸爸,族谱(原型链)
function Person(){}
var p = new Person();
console.log( Person.prototype.__proto__ ); // 找爸爸
console.log( Person.prototype.__proto__.constructor );// 找妈妈 console.log( Person.prototype.__proto__ == Object.prototype );
console.log( Object.prototype.__proto__ ); // null
// 实例对象p的原型链:
// p ==> Person.prototype ==> Object.prototype ==> null;
六、内置对象的原型链
// Array
var arr = new Array();
// 实例对象arr的原型链:
// arr ==> Array.prototype ==> Object.prototype ==> null;
// console.log( Array.prototype.__proto__ );
// console.log( Array.prototype.__proto__.constructor ); // Date
var d = new Date();
// 实例对象d原型链:
// d ==> Date.prototype ==> Object.prototype ==> null; // Math 本身就是个对象(孩子),不是个构造函数,所以不能new
/*var m = new Math(); // error
m ==> */
// Math ==> Object.prototype ==> null;
// 规律: 任何对象的原型链上都有Object.prototype
七、属性查找原则
// 1. 查找对象的属性的时候,首先会在对象自身上来查找是否有该属性,如果有,就返回属性的值
// 2. 如果没有,去原型对象上去查找,如果有,就返回属性的值
// 3. 如果没有,就会沿着对象的原型链继续在往上找,直到Object.prototype,如果有,就返回属性的值
// 4. 如果还没有,返回undefined
// 简单记忆:沿着对象的原型链往上查找
// 注意点:关键看对象身上是否有该属性,而不在乎其值
function Person(name, age){
this.color = "red";
this.name = name;
this.age = age;
}
Person.prototype.name = "lw";
Person.prototype.color = "lime";
Object.prototype.gender = "male";
var p = new Person("xm", 20);
console.log(p);
// p的原型链:
// p ==> Person.prototype ==> Object.prototype ==> null;
console.log( p.color );
console.log( p.name ); // xm
console.log( p.age ); // 20
console.log( p.gender ); // male
console.log( p.sex ); // undefined
案例:
/*function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.name = "lw";
Object.prototype.gender = "male";
var p = new Person(0, 0);
console.log(p);
// p的原型链:
// p ==> Person.prototype ==> Object.prototype ==> null;
console.log( p.name ); // undefined
console.log( p.age ); // undefined
console.log( p.gender ); // male
console.log( p.sex ); // undefined*/
// 2.
function Person(name) {
// 有形参,无实参,形参的值undefined
if (name) {
// if没有执行
this.name = name
}
}
Person.prototype.name = 'ls'
Person.prototype.money = 100
var p = new Person()
console.log(p.name)
console.log(p.money)
八、属性设置原则
// 1. 如果对象有该属性,在设置的时候,其实就是把原来的值给覆盖掉,不会影响到原型上的属性
// 2. 如果对象没有该属性。在设置的时候,其实就是在添加该属性,不会影响到原型上的属性
// 简化理解: 有就覆盖,没有就添加。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.name = "lw";
Object.prototype.gender = "male";
var p = new Person("xm", 20);
// 修改name属性 ==> 因为p自身有
// p.name = "ww";
// 给p添加gender属性,自身本来没有
p.gender = "不清楚";
console.log(p.gender); // 不清楚
console.log(Person.prototype.gender); // male
console.log(Object.prototype.gender); // male
/*console.log(p.name); // ww
console.log(Person.prototype.name); // lw
console.log(Object.prototype.name); // undefined*/
javascript之原型、原型链的更多相关文章
- 对Javascript 类、原型链、继承的理解
一.序言 和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...
- 图解JavaScript中的原型链
转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...
- JavaScript -- 继承与原型链
JavaScript对象有一个指向一个原型对象的链,当试图访问一个对象的属性的时候,他不仅仅会在该对象上面搜寻,还会搜寻该对象的原型,以及对象的原型的原型,依次层层搜索,直到找到名字匹配的属性或者到达 ...
- JAVASCRIPT闭包以及原型链
方法内部还有个方法,实例化父方法后,再次调用父方法,可以运行父方法内部的子方法,这样的程序就叫做闭包 DEMO如下: //function outerFn() { // var outerVar = ...
- javascript进阶-《原型对象和原型链》
原创发布 by @一像素 2015.12 在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象Object 和 函数对象Function. 一般而言,通过new Fun ...
- JavaScript原型&原型链
原型&原型对象 先来一段简单的代码: function Fun(name) { this.name = name } var obj = new Fun('obj') JavaScript中的 ...
- 浅谈Javascript中的原型、原型链、继承
构造函数,原型,实例三者的关系 构造函数: 构造函数是创建对象的一种常用方式, 其他创建对象的方式还包括工厂模式, 原型模式, 对象字面量等.我们来看一个简单的构造函数: function Produ ...
- JavaScript ES5类 原型 原型链 组合、原型、寄生式继承
ES5类 原型 原型链 继承 JavaScript中,原型是相对于构造函数(类)的叫法(或者说概念),原型链是相对于构造函数(类)的实例对象的叫法. 对于JavaScript对象,如果在对象自身上找 ...
- JavaScript中的原型、原型链、原型模式
今天,咱来聊聊JavaScript中的原型跟原型链 原型跟原型模式 这一块的知识,主要是设计模式方面的. 首先,我们知道JavaScript是面向对象的.既然是面向对象,那它自然也有相应的类跟对象等概 ...
- 全面了解 Javascript Prototype Chain 原型链
原型链可以说是Javascript的核心特征之一,当然也是难点之一.学过其它面向对象的编程语言后再学习Javascript多少会感到有些迷惑.虽然Javascript也可以说是面向对象的语言,但是其实 ...
随机推荐
- CENTOS 7平滑升级PHP到最新版7.3
安装Remi和EPEL数据源(仓库) rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm r ...
- P5851 [USACO19DEC]Greedy Pie Eaters P
如果只考虑选哪些奶牛吃派和奶牛吃派的顺序,就会陷入僵局,那么我们可以考虑派的情况. 套路地令 \(f_{i,j}\) 表示 \(i\sim j\) 这一段派,能满足一些奶牛,它们的最大可能体重. \[ ...
- 使用Eclipse创建Maven的JSP项目
使用Eclipse创建Maven的JSP项目 MyEclipse2015根本不行,试过各种解决方案都无济于事. 创建Maven项目 此时项目上有错,pom.xml有错. 修改Java版本 生成web. ...
- FPGA 流水灯
VerilogHDL那些事儿_建模篇(黑金FPGA开发板配套教程) 作者:akuei2 说明:参照该书将部分程序验证学习一遍 学习时间:2014年5月2号 主要收获: 1. 对FPGA有初步了解: 2 ...
- Spring Boot 实现看门狗功能 (调用 Shell 脚本)
需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启.程序升级(如果只需要实现自动升级功能可以使用 inotify)等功 ...
- 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?
第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一. 案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...
- ATT&CK 实战 - 红日安全 vulnstack (一) 环境部署
靶场描述: 红队实战系列,主要以真实企业环境为实例搭建一系列靶场,通过练习.视频教程.博客三位一体学习.另外本次实战完全模拟ATT&CK攻击链路进行搭建,开成完整闭环.后续也会搭建真实APT实 ...
- Python追加文件内容
测试中需要造几百个账号,写了个脚本可以自动生成账号,但想把生成的账号写入一个文件, 开始用的如下的write()方法,发下会先把原文件的内容清空再写入新的东西,文件里面每次都是最新生成的一个账号 mo ...
- Android10_原理机制系列_PMS的启动及应用的安装过程
概述 这里主要介绍 PackageManagerService(简称PMS)的启动 和 一个应用的安装过程.这里只是大致总结,供参考,不少地方同样需要进一步深入了解学习的. 该篇相关代码也是基于And ...
- window下kettle安装
参考这篇文章 http://note.youdao.com/noteshare?id=a8c536ba952a48d60d7ea8f2cc61a94b