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中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...
随机推荐
- HTTP请求方式之GET和POST比较
什么是HTTP协议 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议 HTTP在客户端和服务器之间以request ...
- golang time.Duration()的问题解疑
原文: How to multiply duration by integer? 看到golang项目中的一段代码, ---------------------------------------- ...
- SSD硬盘安装系统后要做的事
1***cmd>fsutil behavior query DisableDeleteNotify 0如果返回值是0,则代表TRIM处于开启状态:反之如果返回值是1,则代表TRIM处于关闭状态2 ...
- TCP_NODELAY和TCP_CORK nagle算法和cork算法
TCP_NODELAY 默认情况下,发送数据採用Nagle 算法.这样尽管提高了网络吞吐量,可是实时性却减少了,在一些交互性非常强的应用程序来说是不同意的.使用TCP_NODELAY选项能够禁止Nag ...
- [AngularJS 1.6] ngModelOptions and inheritance
Problem with ngModleOptions before 1.6: <input type="text" name="fullname" ng ...
- Start Xamarin——与Microsoft 的sales development manager的闲谈
由于在Xamarin属于微软之前,就已经有Xamarin的账号,试用过破解版的.所以4月1号微软set Xamarin free之后.就收到了Xamarin的邀请试用邮件. 试用完了之后第二天.收到邮 ...
- 科普:google的数字图书馆
https://books.google.com/ngrams Google Ngram Viewer,她利用google所拥有的所有图书作为资源,为你提供单词和短语历年使用次数的展示图标.数据化了数 ...
- 获取浏览器弹窗alert、自定义弹窗以及其操作
web自动化测试第10步:获取浏览器弹窗alert.自定义弹窗以及其操作 - CSDN博客 http://blog.csdn.net/ccggaag/article/details/76573857 ...
- C++中UINT32和INT32以及int,BOOL和bool的差别
在AndroidHAL层开发中,编写C++代码的时候.遇到了数据类型的困扰.经过查找资料,总结例如以下: 1.UNIT32和int以及INT32的差别: (1).int默认是signed int.也就 ...
- android studio 使用
java5-7适用android,java8对安卓支持不好. mac osx 需要安装jdk8, google Nexus模拟器, Intellij是JetBrains发布的. Intellij有2个 ...