浅谈JavaScript 覆盖原型以及更改原型

覆盖原型

//囚犯示例
//1.定义原型对象
var proto = {
 sentence : 4, //监禁年限
 probation: 2 //缓刑年限
};
//2.定义原型对象的构造函数
var Prisoner = function(name, id) {
 this.name = name;
 this.id = id;
};
//3.将构造函数关联到原型
Prisoner.prototype = proto;
//4.实例化对象——采用工厂函数实例化对象
var makePrisoner = function(name, id) {
 //采用工厂函数实力化对象prisoner
 var prisoner = Object.create( proto );
 prisoner.name = name;
 prisoner.id = id;
 return prisoner;
}; 

var firstPrisoner = makePrisoner( 'Joe', '12A' ); 

//firstPrisoner.sentence在firstPrisoner对象找不到sentence属性,
//所以查找对象的原型并找到了Both of these output 4
console.log( firstPrisoner.sentence );
console.log( firstPrisoner.__proto__.sentence );
//把对象的sentence属性设置为10
firstPrisoner.sentence = 10;
//outputs 10
//确定对象上的属性值已设置为10
console.log( firstPrisoner.sentence );
//但是对象的原型并没有变化,值仍然为4
console.log( firstPrisoner.__proto__.sentence );
//为了使获取到的属性回到原型的值,将属性从对象上删除
delete firstPrisoner.sentence;
//接下来,JavaScript引擎在对象上不能再找到该属性,
//必须回头去查找原型链,并在原型对象上找到该属性
// Both of these output 4
console.log( firstPrisoner.sentence );
console.log( firstPrisoner.__proto__.sentence );

ubuntu 终端node输出

xxh@xxh-E440:~/workspace$ node t6
4
4
10
4
4
4

那么如果改变了原型对象的属性值,会发生什么呢?我知道你在思考。

以上这篇浅谈JavaScript 覆盖原型以及更改原型就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 关于javascript原型的修改与重写(覆盖)差别详解

    每个JavaScript函数都有prototype属性(javascript对象没有这个属性),这个属性引用了一个对象,这个对象就是原型对象.javascript允许我们修改这个原型对象. 修改有2种方式: 方式1:在原有的原型对象上增加属性或者方法 function Person() { } Person.prototype.add = function(){ alert(this.name); }; Person.prototype.name = "aty"; var p1 = n

  • js怎么覆盖原有方法实现重写

    <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <script> function myblur () { alert("1.离开"); } function bindEvent(func){ myblur = func; } function myonclick() { bin

  • js修改原型的属性使用介绍

    在javascript中原型(prototype)定义了特定类型的所有实例都可以访问的属性和方法,很多些情况下需要重新对原型中的属性赋值,如果方法错误会导致一些意想不到的情况(仅仅是对像我这样的新手奋斗),下面通过测试对这部分知识做一个简单的总结. 基本类型定义如下: 复制代码 代码如下: function Person(){} Person.prototype={ constructor:Person, name:"person", age:100, friends:["a

  • 浅谈JavaScript 覆盖原型以及更改原型

    覆盖原型 //囚犯示例 //1.定义原型对象 var proto = { sentence : 4, //监禁年限 probation: 2 //缓刑年限 }; //2.定义原型对象的构造函数 var Prisoner = function(name, id) { this.name = name; this.id = id; }; //3.将构造函数关联到原型 Prisoner.prototype = proto; //4.实例化对象--采用工厂函数实例化对象 var makePrisoner

  • 浅谈Javascript的静态属性和原型属性

    文章给各位介绍Javascript的静态方法和原型方法一个例子,如果大家对于Javascript的静态方法和原型方法不了解可以和小编一起来看看. 一段代码,了解静态方法和实例方法: <script> //对象构造函数 function Atest(name){ //私有属性,只能在对象构造函数内部使用 var className = "Atest"; //公有属性,在对象实例化后调用 this.name = name; //对象方法 this.hello = functio

  • 浅谈Javascript中的函数、this以及原型

    关于函数 在Javascript中函数实际上就是一个对象,具有引用类型的特征,所以你可以将函数直接传递给变量,这个变量将表示指向函数"对象"的指针,例如: function test(message){ alert(message); } var f = test; f('hello world'); 你也可以直接将函数申明赋值给变量: var f = function(message){ alert(message); }; f('hello world'); 在这种情况下,函数申明

  • 浅谈JavaScript中this的指向更改

    JS中this指向的更改 JavaScript 中 this 的指向问题前面已经总结过,但在实际开中, 很多场景都需要改变 this 的指向. 现在我们讨论更改 this 指向的问题. call更改this指向 call 的使用语法:func.call(thisArg, arg1, arg2, ...) call 方法需要一个指定的 this 值( this要指向的对象 )和一个或者多个参数.提供的 this 值会更改调用函数内部的 this 指向. // 使用 call 方法改变调用函数执行上

  • 浅谈js构造函数的方法与原型prototype

    把方法写在构造函数内的情况我们简称为函数内方法,把方法写在prototype属性上的情况我们简称为prototype上的方法. •函数内的方法: 使用函数内的方法我们可以访问到函数内部的私有变量,如果我们通过构造函数new出来的对象需要我们操作构造函数内部的私有变量的话, 我们这个时候就要考虑使用函数内的方法. •prototype上的方法: 当我们需要通过一个函数创建大量的对象,并且这些对象还都有许多的方法的时候;这时我们就要考虑在函数的prototype上添加这些方法. 这种情况下我们代码的

  • 浅谈JavaScript对象与继承

    JavaScript是我在C语言之后接触的第二门编程语言,大一暑假的时候在图书馆找了一本中国人写的JavaScript程序设计来看.那个时候在编程方面几乎还是小白,再加上那本书根本没有提JavaScript的编程机制,又有一些误导性的话,一直以来对JavaScript有很深的误解,认为JavaScript只是一门在浏览器上运行的面向对象语言,值此文来写下JavaScript当中很具有迷惑性和容易误解的地方.当然限于作者水平有限,也没有什么开发经验,所以难免有疏漏之处,还望批评指正. JavaSc

  • 浅谈JavaScript中this的指向问题

    JavaScript中this指向问题 记得初学 JavaScript 时,其中 this 的指向问题曾让我头疼不已,我还曾私自将其与闭包.原型(原型链)并称 JS 武林中的三大魔头.如果你要想在 JS 武林中称霸一方,必须将这三大魔头击倒.个人认为在这三大魔头中,this 指向问题的武功最菜(难度最低).俗话说柿子捡软的捏,那我们就先从 this 指向问题下手. 先记住攻克 this 指向问题的口诀(前辈们的总结):哪个对象调用函数,函数里的 this 就默认指向哪个对象(注意 this 只能

  • 浅谈JavaScript浅拷贝和深拷贝

    目录 一.直接赋值 二.浅拷贝 三.深拷贝 1. JSON对象的方式 2. 递归复制 网上关于这个话题,讨论有很多了,根据各路情况我自己整理了一下,最后还是能接近完美的实现深拷贝,欢迎大家讨论. javascript中的对象是引用类型,在复制对象的时候就要考虑是用浅拷贝还是用深拷贝. 一.直接赋值 对象是引用类型,如果直接赋值给另外一个对象,那么只是赋值一个引用,实际上两个变量指向的同一个数据对象,如果其中一个对象的属性变更,那么另外一个也会变更. 示例1,简单示例: let human1 =

  • 浅谈javascript中的Function和Arguments

    javascript的Function 属性: 1.Arguments对象 2.caller 对调用单前函数的Function的引用,如果是顶层代码调用,  则返回null(firefox返回undefined).  注:只有在代码执行时才有意义 3.length 声明函数是指定的命名参数的个数(函数定义是,定义参数的个数) 4.prototype 一个对象,用于构造函数,这个对象定义的属性和方法  由构造函数创建的所有对象共享. 方法: applay() --> applay(this,[])

  • 浅谈javascript中new操作符的原理

    javascript中的new是一个语法糖,对于学过c++,java 和c#等面向对象语言的人来说,以为js里面是有类和对象的区别的,实现上js并没有类,一切皆对象,比java还来的彻底 new的过程实际上是创建一个新对象,把新象的原型设置为构造器函数的原型,在使用new的过程中,一共有3个对象参与了协作,构造器函数是第一个对象,原型对象是二个,新生成了一个空对象是第三个对象,最终返回的是一个空对象,但这个空对象不是真空的,而是已经含有原型的引用(__proto__) 步骤如下: (1) 创建一

随机推荐