zoukankan      html  css  js  c++  java
  • JavaScript原型学习笔记

    1.什么是原型?

    原型是一个对象,其他对象可以通过它实现属性继承。

    这里有两个概念,我第一次看原型这块的时候蒙蒙的~~过几天之后就……gg了……

    prototype(原型)属性: 我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象包含可以有特定类型的所有实例共享的属性和方法。这个对象就是原型对象。

    简化一下,每个函数都有一个prototype属性,指向函数的原型对象。

    看一段代码

    1 function Foo() {
    2  }
    3  Foo.prototype.name = "奥特曼";
    4  Foo.prototype.take = function() {
    5      var ftake = "打"
    6      return ftake;
    7  }
    8  var obj = new Foo();

    默认情况下所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。在本例中,原型对象Foo.prototype的constructor属性指向Foo。

    原型对象的内部还包括一个指针__proto__指向构造函数的原型对象

    也就是说上例的原型对象是这样的

    Foo.prototype
    	{
    	constructor: Foo,
    	__proto__: Object.prototype,
    	name:"奥特曼",
    	take: function() {
    		var ftake = "打"
    	    return ftake;
    	}
    }
    

     此处应该有图……我去画一个……

    我已经尽力了……真的……我想有朝一日成为大神看见现在写的画的这些鬼……我会羞愧吧……凑合看吧。。。

    虽然这图歪七扭八的,但是,还是可以看滴,原型链就这么出来啦!!哈哈

    2.原型链

    首先捏,我们查找属性来看一看这个例子的原型链。

     obj.name  找到了奥特曼~~

    但是呢,name是obj的属性吗???

    不是捏~~那么是怎么回事呢??

    当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止,到查找到达原型链的顶部 - 也就是 Object.prototype - 但是仍然没有找到指定的属性,就会返回 undefined。

    那么如果我给obj.name赋值呢?

    obj有了name属性了,那么Foo.name是否也改变了呢??

    结果是Foo.name并未改变。我们发现namet是按着我们所说的向上查找来得到结果的,属性在查找的时候是先查找自身的属性,如果没有再查找原型,再没有,再往上走,一直插到Object的原型上.

    我们给obj.name赋值.obj.name = "小怪兽",实例obj就有了name属性。所有我们会在属性查找时找到obj.name,但是Foo.name也并未改变。

    而我们可以使用toString().hasOwnProperty()等方法也是从原型链向上查找到Object原型上的方法~~

    未完待续~~

  • 相关阅读:
    Studio更新
    gradle 两种更新方法
    Handler基本用法
    使用git克隆指定分支的代码
    Bugly最简单的配置方法
    setTag,getTage复用
    Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
    Android应用如何跳转到应用市场详情页面
    bzoj千题计划249:bzoj5100: [POI2018]Plan metra
    bzoj千题计划248:bzoj3697: 采药人的路径
  • 原文地址:https://www.cnblogs.com/kikiwu/p/4481923.html
Copyright © 2011-2022 走看看