在Javascript中创建对象主要分为三种方式

1、

var catA = {name: "Fluffy", color: "White", age: 0};

2、

var catB = Object.create(new Object());
catB.name = "Fluffy";
catB.color = "White";
catB.age = 0;

3、

function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 0; var catC = new Cat("Fluffy", "White");

 每个函数都有个prototype属性,这是一个对象。如果访问一个对象的属性,首先会在对象内部查找,如果再对象内部中找不到这个属性,会到原型中去找,以此类推。通过每个对象会有一个__proto__来指向prototype。如果对象不是new出来的,则__proto__为{}如

catA.__proto__;
Object { }

  

catC.__proto__;
Cat {age: 0}

  通过调用对象的hasOwnProperty可以判断非原型上定义的属性比如

catC.hasOwnProperty("name");
true catC.hasOwnProperty("color");
true catC.hasOwnProperty("age");
false

改变函数原型对象的属性,会引起对象属性的变化比如。因为有函数new出来的对象中的__proto__指向的是同一个对象即函数的prototype属性。

function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 3; var fluffy = new Cat("Fluffy", "White");
var scratchy = new Cat("Scratchy", "Black"); fluffy.age;
3 scratchy.age;
3 Cat.prototype.age = 4; fluffy.age;
4 scratchy.age;
4

如果对象已经早已被new出来了,后来又改变了构造该对象函数的原型。则不会影响到原来对象的属性变化,因为__proto__还是指向原来的那个对象。

function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 3; var fluffy = new Cat("Fluffy", "White");
var scratchy = new Cat("Scratchy", "Black"); fluffy.age;
3 scratchy.age;
3 Cat.prototype = {age: 4}; fluffy.age;
3 scratchy.age;
3 var muffin = new Cat("Muffin", "Brown"); muffin.age;
4

因为每个对象都有个__proto__属性来指向原型对象,因此如果改变通过该对象的__proto__可以改变原型的属性,从而影响其他已经或者即将new的对象。

function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 3; var fluffy = new Cat("Fluffy", "White");
var scratchy = new Cat("Scratchy", "Black");
Compare this example: fluffy.age = 4; fluffy.age;
4 scratchy.age;
3
To this example: fluffy.__proto__.age = 4; fluffy.age;
4 scratchy.age;
4

javascript 继承的实现

function Animal(name) {
this.name = name;
}
Animal.prototype.age=1; function Cat(name, color) {
Animal.call(this, name);
this.color = color;
}
Cat.prototype = new Animal(null); var catC = new Cat("Fluffy", "White"); catC.name;
Fluffy catC.color;
White catC.age;
1

理解Javascript的Prototype的更多相关文章

  1. 理解JavaScript的prototype和__proto__

    首先,要明确几个点: 1.在JS里,万物皆对象. 方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__pro ...

  2. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  3. 深入理解javascript原型和闭包(3)——prototype原型 (转载)

    深入理解javascript原型和闭包(3)——prototype原型   既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的 ...

  4. 深入理解javascript原型和闭包 (转)

    该教程绕开了javascript的一些基本的语法知识,直接讲解javascript中最难理解的两个部分,也是和其他主流面向对象语言区别最大的两个部分--原型和闭包,当然,肯定少不了原型链和作用域链.帮 ...

  5. 深入理解javascript原型和闭包系列

    从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然不至于上头条,但是也算是中规中矩,有看的人,也有评 ...

  6. 深入理解Javascript中构造函数和原型对象的区别

    在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor) ...

  7. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  8. 深入理解javascript原型和闭包(2)——函数和对象的关系

    上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  9. 深入理解javascript原型和闭包(4)——隐式原型

    注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...

随机推荐

  1. 生成短的uuid

    package test1; import java.util.Random; import java.util.UUID; public class ShareCodeUtil { private ...

  2. java 字符串排序

    http://bbs.csdn.net/topics/280032929 大可不需要那样复杂了!(一)如果要排序的为字符串,如:String sortStr = "ACDFE";  ...

  3. 11.solr学习速成之MoreLikeThis

    Solr相似匹配    在网页搜索或电商产品搜索结果页面,很多时候会看到一个相似文档.相似产品或找相似的链接.Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeT ...

  4. Django学习---自定义分页

    自定义分页 简单例子: urls.py: from django.contrib import admin from django.urls import path from django.conf. ...

  5. Nuxt.js开启SSR渲染快速入门

    第一节:nuxt.js相关概述 nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).Vue.js是开发SPA(单页应用)的,Nuxt.js这个框架,用Vue开发多 ...

  6. Halcon算子之shape_trans,用于变换区域的形状

    函数原型:shape_trans(Region : RegionTrans : Type : ) *shape_trans*仍然是区域,smallest_rectangle1可以获得四个角的坐标 函数 ...

  7. 流程管理软件(BPM)功能简介

    易协流程管理系统实现将人为控制的业务活动,通过信息化手段实现系统控制,降低人为控制管理的风险以及促进企业的各项决策方针的顺利实施. 系统目标: 实现管理的规范化.制度化.程序化: 帮助企业将内控制度流 ...

  8. leetcode334

    public class Solution { public bool IncreasingTriplet(int[] nums) { var len = nums.Length; ) { retur ...

  9. objective c to pas

    https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol ...

  10. Itext读取PDF模板文件渲染数据后创建新文件

    Maven导入依赖 <properties> <itextpdf.version>5.5.0</itextpdf.version> <itext-asian. ...