js原型链的研究

理解对象属性

        面向对象语言的标志是都有类的概念但是js没有类这个概念,因此它的对象和基于类的语言中的对象有所不同。

        创建对象的方法:

var person = new Object();

person.name = "sulishi";

ES6简洁方法:允许在对象中只写属性名,不写属性值这个时候属性值就是属性名代表的变量

var foo =‘bar’

var baz = {foo};

属性(property)类型

1.数据属性

        ·[[Configurable]]:表示能否用delect删除属性或是能否修改属性特性默认值为true

        ·[[Enumberable]]:能否通过for-in返回属性 默认true

        ·[[Writable]]:能否修改属性的数据值,默认undefined

        ·[[Value]]:包含这个属性的数据值默认undefined

要修改属性默认的特性必须用

Object.defineProperty()//vue的数据双向绑定的核心也是这个

IE8是第一个实现object.definpProperty()方法的浏览器,但是有很多bug不建议在这个里面使用

2.访问器属性

    ·[[Get]]:读取属性时调用的函数 默认undefined·

    ·[[Set]]:写入属性时调用的函数  默认undefined

访问器属性不能直接定义,必须使用和上面一样的方法

eg:

var book = {

_year: 2004,

edition: 1

};

Object.defineProperty(book, "year", {

get: function(){

return this._year;

},

set: function(newValue){

if (newValue > 2004) {

this._year = newValue;

this.edition += newValue - 2004;

            }

        }

        });

book.year = 2005;

alert(book.edition); //2

get 和 set不一定非得同时指定getter和setter,只指定getter然意味着属性是不能写的

object.defineProperties()

利用这个方法可以通过描述符一次定义多个属性。这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。

Object.getOwnPropertyDescriptor()

可以取得给定属性的描述符。这个方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。返回值是一个对象,如果是访问器属性,这个对象的属性有 configurable、enumerable、get 和 set;如果是数据属性,这个对象的属性有 configurable、enumerable、writable 和 value。

工厂模式,构造函数模式

原型模式

    1.理解原型对象

        只要创建新函数,就会根据特定的规则给该函数创建一个prototype属性,指向函数的原型对象。默认所有原型对象都会自动获得一个constructor属性


对象之间的关系

实现原型链基本模式

实现原型链的基本模式


实例以及构造函数和原型之间的关系

call(),apply()

·call(xx)传递参数进行继承

浅复制,深复制

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容