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中原型和原型链的更多相关文章

  1. 关于JS面向对象中原型和原型链以及他们之间的关系及this的详解

    一:原型和原型对象: 1.函数的原型prototype:函数才有prototype,prototype是一个对象,指向了当前构造函数的引用地址. 2.函数的原型对象__proto__:所有对象都有__ ...

  2. JavaScript中原型和原型链

    原型[prototype]: 为其他对象提供共享属性的对象. 每个函数都有一个原型(prototype)属性,这个属性是一个指针,指向一个对象,这个对象包含特定实例共享的一些属性和方法. 以例服人: ...

  3. JS中注意原型链的“指向”

    昨天压缩Js文件时发现了项目中的一个prototype的问题代码如下所示: 1. <script> var XXX = function(){ }; var x1 = new XXX(); ...

  4. JS 一条原型链扯到底

    在正文之前,首先要知道两点, 1.__proto__是每个js 对象的内置属性,而prototype 是函数的内置属性,也是一个对象. 2.所谓原型,指的就是每个函数对象的prototype属性. f ...

  5. js继承之原型链继承

    面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法. 一.构造函数.原型与实例之间的关系 每创建一个函数,该函数就会自动带有一个 prototype 属性.该属性是个指针, ...

  6. JS对象、原型链

    忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...

  7. JS面向对象之原型链

      对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...

  8. 深入理解JS对象和原型链

    函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...

  9. JS中的原型链和原型的认识

    这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...

随机推荐

  1. 关于 TCP 并发连接的几个思考题与试验

    http://blog.csdn.net/solstice/article/details/6579232

  2. DOM对象与jquery对象的互相转换

    一開始总是对DOM对象和jQuery对象搞不清楚.如今对此做一下总结: DOM 对象:文档对象模型.每一份DOM都能够看作一棵树.像ul,li ol  dl  p  h1  等等都是DOM元素节点.能 ...

  3. C++进阶之虚函数表

    C++通过继承(inheritance)和虚函数(virtual function)来实现多态性.所谓多态,简单地说就是,将基类的指针或引用绑定到子类的实例,然后通过基类的指针或引用调用实际子类的成员 ...

  4. Msql入门实战之下

    前面一章主要解说了mysql的select的使用方法.将select的大部分使用方法进行分别解说.本章主要解说Msql约束表的建立,以及存储过程的实现,附带其它介绍.临时就算入门了,Mysql索引之后 ...

  5. ramfs、rootfs和initramfs【转】

    ramfs, rootfs and initramfs October 17, 2005 Rob Landley <rob@landley.net> =================== ...

  6. ios22--动画

    控制器: // // ViewController.m // 07-渐变动画 // // Created by xiaomage on 15/12/30. // Copyright © 2015年 小 ...

  7. 2.6 wpf标记扩展

    1.什么是标记扩展?为什么要有标记扩展? 标记扩展是扩展xmal的表达能力 为了克服现存的类型转换机制存在的 常用的标记扩展有如下: x:Array 代表一个.net数组,它的子元素都是数组元素.它必 ...

  8. [luogu2620]虫洞

    https://www.zybuluo.com/ysner/note/1284536 题面 给一个一维坐标系,出发点为\(0\),目标点为\(w\). 每\(1\)秒可以往后移不超过\(s\)个单位距 ...

  9. POJ1673 ZOJ1776 三角形四心模板

    POJ1673 题中所述点即为三角形的垂心,用向量法可以轻松证明. 垂心 重心 外心 均位于三角形的欧拉线上,且三者有线性关系,于是,求出重心和外心即可求得垂心. 重心就是三点的平均值,外心可以通过解 ...

  10. Spark 二项逻辑回归__二分类

    package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{B ...