js中原型和原型链
1.原型: 在JavaScript 中,对象被表现为prototype 。
原型其实一直存在于我们接触过的任何一个对象。
2.
Tip:在函数对象中也存在__proto__属性,但是查看函数对象的原型还是要使用prototype 。
JavaScript 在创建对象的时候,无论是普通对象还是函数对象,都存在一个属性__proto__,
JavaScript 的原型链 和继承主要依赖于__proto__
我们可以通过__proto__ 和 prototype的结合 查看原型的每一个层级,也就是原型链。
Tip:在js中,原型和原型链是实现继承的一种模型。
X.a();
当我们调用一个对象的属性或者方法的时候,系统会查询这个对象,如果这个对象中不存在这个方法,就会向上一层查询,如果上一层还是没有这个属性或者方法,就继续沿着原型链去找,一直找到原型的最顶端,object 的上一层 null才会停止。
3.简单的继承
var a = {
x : 1,
y : 2
}
var b = {
z : 3,
w : 4
}
b.__proto__ = a;//b的原型是a,b继承a
console.log(b);
console.log(b.x);
4.create创建对象的一种方式
var a = Object.create({x:1});
console.log(a.__proto__);//{x:1}
var b = Object.create(null);
console.log(b);//Object No Properties
var e = "hello";
console.log(e.__proto__);//String {length: 0, [[PrimitiveValue]]: ""}
var dd = Object.create(Object.prototype);
console.log(dd);
console.log(dd.__proto__);
5.constructor 属性返回对创建此对象的数组函数的引用。
var a = 10;
console.log(a.constructor);//function Number
var b = "hello";
console.log(b.constructor);//function String
6.继承
/* 需求:让我们新创建对象a 能够同时拥有 Show对象和 SHow对象原型的方法和属性。
TIp:需要明白:js的原型是可以更改的。
实现思路: 我们要通过更改原型的方式来实现继承。
Why? 因为js中的机制是:对象会从原型无条件的继承属性和方法。
我们才去将a对象的原型重新赋值为实例化后的show对象。
*/
function Show(){
this.getName = function (name){
alert(name);//爸爸
}
}
Show.prototype.getAge = function (age){
alert(age);//爷爷
}
// console.log(Show);
// console.log(Show.prototype);
var a = {};//干儿子 object function Obejct
a.__proto__ = new Show();//如果采用这种方式去实现继承的话,会发现,
//a原型的构造函数和本身的构造函数被破坏了,那么这种情况是不利用开发的
//容易出现不可预知的错误,所以,我们在下一步,要将a原型的构造函数改为a本身也就是obejct。
// console.log(a.constructor);
a.__proto__.constructor = a;
// a.getName('dav');
// a.getAge(10);
console.log(a);
console.log(a.__proto__);
console.log(a.__proto__.constructor);
// a.__proto__ = Show.prototype;
// a.getAge(2);
// a.getName('dav');
7.继承
/* m 对象 n对象 k对象
需要k对象拥有m对象和 n对象的属性和方法
*/
function m ()
{
this.showM = function (){
alert('this is M')
}
}
function n()
{
this.showN = function (){
alert('this is N');
}
}
function k()
{ } n.prototype = new m();
n.prototype.constructor = n; k.prototype = new n();
k.prototype.constructor = k; var boo = new k();
boo.showM();
boo.showN();
8.跳过继承过来的属性或方法
var a = {
x:1,
y:2
}
var b ={
a :3,
c:4
}
b.__proto__ = a;
console.log(b);
for(var i in b)
{
if(!b.hasOwnProperty(i)){//能够将继承过来的属性或者方法跳过,不去遍历出来
continue;
}
else
{
document.write(b[i] + '<br/>')
}
}
js中原型和原型链的更多相关文章
- 关于JS面向对象中原型和原型链以及他们之间的关系及this的详解
一:原型和原型对象: 1.函数的原型prototype:函数才有prototype,prototype是一个对象,指向了当前构造函数的引用地址. 2.函数的原型对象__proto__:所有对象都有__ ...
- JavaScript中原型和原型链
原型[prototype]: 为其他对象提供共享属性的对象. 每个函数都有一个原型(prototype)属性,这个属性是一个指针,指向一个对象,这个对象包含特定实例共享的一些属性和方法. 以例服人: ...
- JS中注意原型链的“指向”
昨天压缩Js文件时发现了项目中的一个prototype的问题代码如下所示: 1. <script> var XXX = function(){ }; var x1 = new XXX(); ...
- JS 一条原型链扯到底
在正文之前,首先要知道两点, 1.__proto__是每个js 对象的内置属性,而prototype 是函数的内置属性,也是一个对象. 2.所谓原型,指的就是每个函数对象的prototype属性. f ...
- js继承之原型链继承
面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法. 一.构造函数.原型与实例之间的关系 每创建一个函数,该函数就会自动带有一个 prototype 属性.该属性是个指针, ...
- JS对象、原型链
忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...
- JS面向对象之原型链
对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...
- 深入理解JS对象和原型链
函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...
- JS中的原型链和原型的认识
这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...
随机推荐
- 无线安全课堂:手把手教会你搭建伪AP接入点
概述 *本文假设读者对设置伪AP接入点以及Apache配置有足够了解. 在本攻击场景中,我们将使用到alfa无线网卡以及用于网络访问的以太网连接(虚拟机环境下,物理机下无需此配置).你也可以使用虚拟接 ...
- 电脑无线WIFI怎么共享给手机
点屏幕右下角的那个小电脑(网络)标志,里面有打开网络和共享中. 选左上角管理无线网络——选择添加. 选择创建临时网络——点击下一步——输入网络名称. 安全类型选择WEP——安全密钥为10位数字——然后 ...
- 【CV论文阅读】Deep Linear Discriminative Analysis, ICLR, 2016
DeepLDA 并不是把LDA模型整合到了Deep Network,而是利用LDA来指导模型的训练.从实验结果来看,使用DeepLDA模型最后投影的特征也是很discriminative 的,但是很遗 ...
- Xcode中git的用法介绍与"Please tell me who you are"问题的解决方式
我在之前多篇博客中解说了怎样使用命令行操作git,能够大大提高我们的工作效率.详细能够參考<Git学习札记><Git学习札记--进阶>等文章.事实上对于同一个工具,我们有不同的 ...
- HDOJ 5387 Clock 水+模拟
Clock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Subm ...
- 获取发布的头条的url,避免点击打开新的页面
https://www.toutiao.com/ document.getElementsByClassName("ugc-mode-content")[0].getElement ...
- Ubuntu 安装Consolas字体
下载 YaHei.Consolas https://code.google.com/p/uigroupcode/downloads/list 安装 1.创建文件夹 sudo mkdir -p /usr ...
- flask核心对象Flask实例初探
flask的核心程序就两个: werkzegu(WSGI)库,封装了http.web通信等最关键的wsgi功能②Jinja2是Python下一个被广泛应用的模版引擎,方便了html模板的创建和使用 而 ...
- Java Graphics2D类的绘图方法
Graphics2D继承自Graphics,它扩展了Graphics的绘图功能,拥有更强大的二维图形处理能力,提供对几何形状.坐标转换.颜色管理以及文字布局等更精确的控制. Graphics2D定义了 ...
- 如何给mysql用户分配权限+增、删、改、查mysql用户
在mysql中用户权限是一个很重析 参数,因为台mysql服务器中会有大量的用户,每个用户的权限需要不一样的,下面我来介绍如何给mysql用户分配权限吧,有需要了解的朋友可参考. 1,Mysql下创建 ...