之前在学习原型(prototype)的时候,一直对原型的理解不是很清晰,只是知道每个对象都有一个原型,然后在js中万物又皆对象。在这里谈一下自己对于js原型的简单理解吧。

原型可以实现属性和方法的共享。

原型链理解:

假设有一个对象o,其有自己的属性a和b:

{a:1,b:2};

然后o的原型o.[[prototype]]又有自己的属性b和c:

{b:3,c:4};

最后,o.[[prototype]].[[prototype]]为null。这就是原型链的末尾,即null,根据定义,null没有[[prototype]]

综上,整个原型链如下:

{a:1,b:2} ---> {b:3,c:4} ---> null;

console.log(o.a);  // 1  a为o的自身属性

console.log(o.b);  // 2  b为o的自身属性 但是o.[[prototype]]上面还有个b属性,但是它不会被访问到,这种情况称之为属性遮蔽(property shadowing)

console.log(o.c);  // 4  c不是o的自身属性,那看看o.[[prototype]]上面有没有,在o.[[prototype]]上找到了c属性,那么c的值为4

console.log(o.d);  // undefined 现在o上面找,没有d属性;再到o.[[prototype]]上面找,也没有;最后到o.[[prototype]].[[prototype]]上面找,

o.[[prototype]].[[prototyoe]]为null,停止寻找,返回undefined。

创建一个对象它自己的属性的方法就是设置这个对象的属性。唯一例外的获取和设置的行为规则就是当有一个 getter或者一个setter 被设置成继承的属性的时候。

继承方法:

JavaScript 并没有其他基于类的语言所定义的“方法”。在 JavaScript 里,任何函数都可以添加到对象上作为对象的属性。函数的继承与其他的属性继承没有差别,包括上面的“属性遮蔽”(这种情况相当于其他语言的方法重写)。

当继承的函数被调用时,this 指向的是当前继承的对象,而不是继承的函数所在的原型对象。

var o = {

  n:1,

  m:function(){

    return this.n + 1;

  }

};

console.log(o.m()); // 2    当调用m方法时,this指向o;

var p = Object.create(o);

p.n = 10;

console.log(p.m()); // 11  调用m方法时,this指向当前调用它的p;

Object.create()创建一个新对象,新对象的原型就是调用时传入的第一个参数;

所以上面原型链为:

p ---> o ---> Obejct.prototype ---> null;

o继承了Object上面所有的属性和方法;所以对象所具有的属性和方法,o都可以使用;

对象具有hasOwnProperty()属性; 注意:hasOwnProperty() 判断的只是自己是否具有该属性或者方法 继承过来的属性和方法不算自身的;

hasOwnProperty 是 JavaScript 中唯一一个只涉及对象自身属性而不会遍历原型链的方法。

  console.log(o.hasOwnProperty('m'));   // true;  o对象有自己的m方法

  console.log(p.hasOwnProperty('m'));  // false;   p对象没有自己的m方法 它是继承自o的

var arr = [1,'str',true,o];

数组都继承自Array.prototype(indexOf,forEach等方法都是从它继承而来);

原型链如下:

arr ---> Array.prototype ---> Object.prototype ---> null;

function a(b){

  return b;

}

函数都继承自Function.prototype(call,bind等方法都是继承而来);

原型链如下:

a ---> Function.prototype ---> Object.prototype ---> null;

使用构造器创建函数:

在js中,构造器其实就是一个简答的函数,当使用new操作符来操作这个函数时,它就可以被称为构造函数(构造方法);

function Person(){

  this.eyes = [];

  this.hands = [];

}

Person.prototype.addEyes= function(e){

  this.eyes.push(e);

}

var p  = new Person();

p是生成的对象,它自身有属性'eyes' 和 'hands',在p被实例化的时候,它的原型指向Person.prototype;

在用原型继承编写复杂代码前理解原型继承模型十分重要。同时,还要清楚代码中原型链的长度,并在必要时结束原型链,以避免可能存在的性能问题。此外,除非为了兼容新 JavaScript 特性,否则,永远不要扩展原生的对象原型。

js原型浅谈理解的更多相关文章

  1. 对js原型简单的理解和图解

    对js原型简单的理解和图解 最近在努力的学习js中,今天就抽了个空把自己理解的原型,记下一下在笔记中,以后自己查看,有空在会把原型链记录一下. 1.prototype prototype:是一个函数的 ...

  2. Js之浅谈dom操作

    JavaScript之浅谈dom操作 1.理解dom: DOM(Document Object Model ,文档对象模型)一种独立于语言,用于操作xml,html文档的应用编程接口. 怎么说,我从两 ...

  3. 谈谈我对 js原型链的理解

    想要学习 “原型链” 必须要认识什么是 “原型” 和 “原型链” 先理解一下普通的继承和原型的区别,下面写一段js代码来帮助理解: var Animal = function(){ // 动物抽象类 ...

  4. JS原型链的理解和使用(一)

    一些个人的理解,不一定是对的,仅供参考. 在JS中有函数和对象两个概念,而又有一切皆对象的概念及函数也是一个对象.所以可以说函数一定可以作为一个对象,而对象不一定是一个函数. 也可以说在js中对象分为 ...

  5. js原型链结构理解

    在一般的面向对象的语言中,都存在类(class)的概念,类就是对象的模板,对象就是类的实例. 但在js中是没有类的定义的(万物皆是对象).  题外话:但是在ES6中提供了更接近传统语言的写法,引入了C ...

  6. JS原型链的理解和使用(二)

    根据在创建对象的时候,创建出来的对象的__proto__指向创建这个对象的函数的prototype属性. 由于在调用对象的属性或者方法的时候会首先在对象的作用域中查找指定的属性或者方法,如果未找到则会 ...

  7. 对JS原型的一些理解

    一.首先给出一道经典的原型题目: var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = fun ...

  8. js变量浅谈

    js变量是除了this以外最让人恶心的东西了,还因为烂语法造成各种各样奇奇怪怪的事情发生,下面让我们来谈谈都有什么奇怪的事: 1.用var与不用var function test(){ a = 123 ...

  9. JS基础——浅谈前端页面渲染和性能优化

    加载html中的静态资源 其中,加载静态资源的过程,一般为浏览器根据DNS服务器得到域名的IP地址,然后向这个IP的机器发送http请求,服务器收到.处理并返回http请求,浏览器得到返回http请求 ...

随机推荐

  1. 修改ftp服务的监听端口

    需求说明: 今天在做一个项目的时候,低端的端口都给屏蔽掉了,需要进行修改为高端端口才能访问,在此记录下. 操作过程: 1.修改ftp的配置文件vsftpd.conf,增加以下的配置 listen_po ...

  2. win7 IIS7 发布网站遇到 HTTP 错误 500.19 由于权限不足

    win7 IIS7 发布网站遇到 HTTP 错误 500.19 - Internal Server Error 一看是5xx错误,就知道是服务器的问题,网上查了下,原来是权限问题 解决方法       ...

  3. java的this static public protected private abstract interface 在python的对应,java python一些区别

    1.因为工作的原因,最近使用了三个多月的java作为主力语言.很早之前在菜鸟教程也看过java文档两遍,但实践少,处于能看懂写出来不流畅的状态(对于java必须要略懂,不能能看到就头疼跳过,因为现在百 ...

  4. js提取新浪邮箱的信用卡

    js提取用户新浪邮箱中的信用卡信息,是js非nodejs. 对比py,之前就做不好,出现了复杂点选验证码.js的开发速度只需要py的三分之一,甚至十分之一. js在客户端执行,py在后端执行,py要实 ...

  5. association 的使用

    <resultMap id="wmsTaskMap" type="WmsTask"> <id column="ID" jd ...

  6. MapWinGIS------引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常

    转载:http://www.cnblogs.com/dzone/archive/2011/09/08/2171445.html

  7. Dubbo -- 系统学习 笔记 -- API参考手册

    Dubbo -- 系统学习 笔记 -- 目录 API参考手册 配置API 注解API 模型API 上下文API 服务API API参考手册 Dubbo的常规功能,都保持零侵入,但有些功能不得不用API ...

  8. WAMP运行分析

  9. spine-unity3D 学习笔记

    http://zh.esotericsoftware.com/spine-using-runtimes //skeletonData SkeletonAnimation skeletonAnimati ...

  10. Linux下用C获取当前时间

    Linux下用C获取当前时间,具体如下: 代码(可以把clock_gettime换成time(NULL)) ? 1 2 3 4 5 6 7 8 9 10 void getNowTime() {  ti ...