JavaScript中的 原型 property 构造函数 和实例对象之间的关系
1 为什么要使用原型?
/*
* javascript当中 原型 prototype 对象
*
* */
//首先引入 prototype的意义,为什么要使用这个对象 //先来写一个构造函数的面向对象实例
function Person(name ){
this.name = name;
this.show = function(){
return this.name;
};
}
//实例化两个对象
p1 = new Person("a");
p2 = new Person("b");
//alert(p1 == p2); // false 很显然两个实例对象不是一个对象
//alert(p1.show == p2.show); // false 实际上每一个对象实例化的时候都各自拥有自己的这个方法 /*
* 实际上,上面的例子,对于show函数来说,其实每一个Person的对象,都拥有这个方法,并且功能是一样的,这其实是占用内存的,重复累赘的
* 如果可以更好的 话,一个面向对象过程,相同的属性和方法,最好还是能所有对象拥有同一份公共相同方法和属性,
*
*
* 在js当中这就需要引入原型的概念:
* 在js中,每一个函数都有一个属性prototype 是一个指向自己的原型对象的引用。
* 原型对象是一个对象, 如果我们把希望共有的方法和属性写入原型对象当中,就能实现,在每一个实例化对象不新建一个方法和属性,
* 而是使用原型对象的提供的方法和属性
*
* */ //这是一个类
function Person(){ }
//下面我们向这个Person类的原型对象里面添加属性和方法
Person.prototype.name = "张三";
Person.prototype.show = function(){
return this.name;
}; //实例化两个Person的对象
var p1 = new Person();
var p2 = new Person();
//alert(p1.name); //张三
//alert(p1.name == p2.name); //true 加入原型对象的属性就变成了公共属性,所有对象拥有相同一份
//这个时候我们给p1 增加自己的变量 覆盖name
p1.name = "李四";
//alert(p1.show()); //李四 这个name变量实际上没有覆盖原型类当中,而是p1对象自己的成员变量
//这个时候把p1的name删除,再取p1的name,就又会取到原型对象的name
delete p1.name;
//alert(p1.show()); //张三 这个时候,自己没有成员变量name , 就会使用原型对象中共有的name //alert(p1.show == p2.show); // true 这两个实例对象都没有实现show 这个show是原型类提供的 /*
* 经过上面的分析 再来整理一下 原型对象:
*
* 1 任何一个函数 他的prototype属性都是一个指向自己原型对象的引用
* 2 某个函数实例在调用方法或者取属性的时候,先找自己的成员变量,如果没有再找自己的原型对象中的共有变量
* 3 相同构造函数出来的所有实例对象的protorype 指向的原型 都和构造函数的原型是同一个原型对象
* 4 写入原型中的方法和属性是共有的,如果实例对象重写,会添加私有变量 不会覆盖原型中的内容
* 5 原型对象的构造器指向的就是拥有这个原型的初始的构造函数。
*
* */
2 构造函数 实例对象 和原型对象的关系
/*
JavaScript中 构造函数、实例对象、原型之间的关系:
构造函数内的变量和方法,每一个实例对象初始化的时候都会为自己实例化这些属性方法
构造函数的prototype属性,是一个引用,指向他的原型对象
构造函数实例化出来的所有对象和构造函数共有一个原型对象,他们的prototype都指向同一个原型
原型对象中的属性方法是构造函数和实例对象共有的,实例对象初始化不会为自己创建这些属性和方法。
当调用实例对象的属性的时候,会有限找自己的私有变量,没有的话就去找原型对象的变量,再没有就返回undefined */
//一个构造函数
function Person(){ }
//Person的原型对象 设置公共属性和方法
Person.prototype.name="haha";
Person.prototype.age=18;
Person.prototype.sayName = function(){
alert(this.name);
}; // 实例化对象
var p1 = new Person();
alert(p1.name); //haha 这里会找到原型对象中的公共属性 //利用Object.getPrototypeOf(obj) 能够取得obj的原型对象
alert(Person.prototype == Object.getPrototypeOf(p1)); //true 构造函数实例化的对象他们之间共有一个原型对象 /*
当调用对象属性的时候
先搜索自己的私有属性
如果没有 再搜索原型对象的属性
如果没有 返回undefined 对象设置私有属性不会修改原型内容,只会自己添加属性
*/
//实例化另一个对象
var p2 = new Person();
//给p2添加私有属性
p2.name = "xixi";
alert(p2.name); //xixi
delete p2.name;
alert(p2.name); //haha // 检查一个对象的属性是不是自己的 hasOwnProperty()
p2.name = "xixi";
alert(p2.name); //xixi
alert(p2.hasOwnProperty("name")); //true
delete p2.name;
alert(p2.name); //haha
alert(p2.hasOwnProperty("name")); //false // in 操作符 返回 属性是否在对象中或者在原型中
alert( "name" in p2 ); //true // 结合in和hasOwnProperty 判断 属性是不是原型的属性
function isPrototypeProperty( obj , property ){
// 不是自己的私有属性并且是自己的属性
return !obj.hasOwnProperty(property) && property in obj;
} //Object.keys(obj) 返回obj对象中能够被枚举的私有属性的数组 constructor 是不能被枚举的
p2.name = "xixi";
p2.age=10;
alert(Object.keys(p2)); // name,age
alert(Object.keys(Person.prototype)); //name,age,sayName // Object.getOwnPropertyNames(obj) 返回obj所有属性的数组
alert(Object.getOwnPropertyNames(Person.prototype)); // name,age,sayName,constructor
JavaScript中的 原型 property 构造函数 和实例对象之间的关系的更多相关文章
- js高级——构造函数,实例对象和原型对象——prototype、__proto__和constructor构造器
一.前言 了解JavaScript面向对象,需要先了解三个名词: 构造函数,实例对象和原型对象. 注意:JavaScript中没有类(class)的概念,取而代之的是构造函数,两者类似却又有很大的差别 ...
- JavaScript中通过原型添加方法,解决数据共享问题,节省内存空间
涉及知识点:(1)原型的引入(2)构造函数.原型对象和实例对象之间的关系(3)__proto__和prototype的理解 直接举例:在自定义构造函数创建对象时,因为创建的对象使用的不是同一个方法,所 ...
- javascript中的原型和原型链(二)
原型(prototype) 函数的 prototype 属性(图) 每个函数都有一个prototype属性,它默认指向一个Object空对象(即称为:原型对象) 原型对象中有一个属性construct ...
- javascript的构造函数和实例对象、prototype和__proto__的区别,原型对象及构造器的理解
一.前言 我们先通过代码来分别打印出实例对象.构造函数,以及修改了原型对象的构造函数,通过对比内部结构来看看他们之间的区别. //定义构造函数 function Person(name, age){ ...
- Javascript原型、构造函数、实例的关系
1. 原型.构造函数.实例的关系 原型: 原型通过constructor指向构造函数,原型如果是自定义对象且没有明确将constructor指向构造函数,则原型的constructor指向函数的基类F ...
- 【转】JavaScript中的原型和继承
请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...
- javascript中的原型继承
在Javascript面向对象编程中,原型继承不仅是一个重点也是一个不容易掌握的点.在本文中,我们将对Javascript中的原型继承进行一些探索. 基本形式 我们先来看下面一段代码: <cod ...
- 图解JavaScript中的原型链
转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...
- 前端知识体系:JavaScript基础-原型和原型链-理解原型设计模式以及 JavaScript中的原型规则
理解原型设计模式以及 JavaScript中的原型规则(原文地址) 1.原型对象:我们创建的每一个函数(JavaScript中函数也是一个对象)都有一个原型属性 prototype,原型属性实质上是一 ...
随机推荐
- Cucumber 行为驱动开发简介
Cucumber 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言. 现在看看Cucumber中用到的术语 . ...
- find命令总结
find命令 2018-2-27日整理完成 1,结合-exec的用法 查当前目录下的所有普通文件,并在 -exec 选项中使用ls -l命令将它们列出# find . -type f -exec ls ...
- 《Linux命令行与shell脚本编程大全》- 读书笔记3 - 理解shell
当用户登录终端的时候,通常会启动一个默认的交互式shell.系统究竟启动哪个shell,这取决于用户配置.一般这个shell都是/bin/shell.默认的系统shell(/bin/sh)用于系统sh ...
- 通向架构师的道路之 Tomcat 性能调优
一.总结前一天的学习 从"第三天"的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: 吞吐量 Responsetime Cpuload MemoryUsage 我们也 ...
- 前端的UI设计与交互之布局篇
布局是页面构成的前提,是后续展开交互和视觉设计的基础.设计者在选择布局之前,需要注意以下几点原则:明确用户在此场景中完成的主要任务和需获取的决策信息.明确决策信息和操作的优先级及内容特点,选择合理布局 ...
- ELK学习笔记(一)安装Elasticsearch、Kibana、Logstash和X-Pack
最近在学习ELK的时候踩了不少的坑,特此写个笔记记录下学习过程. 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因 ...
- c语言博客第二次作业
一.PTA实验作业 题目1:计算分段函数[2] 1.实验代码 { double x,y; scanf("%lf",&x); if(x>=0) { y=pow(x,0. ...
- Week03-面向对象入门
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等 类 对象 封装 继承 覆盖 重载 构造函数 static public private toString f ...
- 开启Linux的share
1.挂载Install Vmare Tool 2.解压VMwareTools.tar.gz 3.安装share目录 4.shared Folders Enabled 添加共享的目录. 在自己的Unb ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.11.14
第一次会议:2017-11-14 额--这几天比较忙,忘记上传了,今天补上 先上个图,O(∩_∩)O哈哈: 会议主要内容: 1. 讨论整体框架 2. 个人具体分工 3. 代码统一 具体分工: 成员 计 ...