defineProperty

  • defineProperty

这个是定义一个原型。

let p = {}
Object.definePrototype(p, 'name', {
    value: function(){console.log('i am name')}
})

这个是定义一个name属性。

注意:defineProperty定义的属性,属性特性(writable, configurable, enumerable)是false, 而字面量创建的对象,默认是true. Property Descriptors

  • defineProperties

这个是在原型上定义多个属性

let person = {}
Object.defineProperties(person, {
    names: {
        value: 'name'
    },
    age: {
        value: 'age'
    }
})

definePropertiesdefineProperty定义的数据属性,若不指定,默认的内部属性为false

  • {} 这种是属于字面量创建了,默认的内部属性都是true.

    • 数据属性(Configurable, Enumerable, Writeable)默认都是true, Valueundefined.

    • 访问器属性(Configurable, Enumerable, Get, Set)中前两个默认为true, 后两个默认为undefined

  • Object.getPrototypeOf(obj)

这个是获取一个原型

  • Object.setPrototypeOf(original, newer)

这个是设置新的原型,在es6中出.

  • obj.hasOwnProperty 这里是可以判断是否在实例上存在对应的属性。

    只是在对应的目标对象上发生作用。

  • constructor

这个东西比较容易搞混淆。constuctor并不是说函数是一个constructor,而是说被new关键字调用的函数才是构造函数。

constructor介绍

所以可以看出一些区别来。

针对于上面这点,我们来继承

//3在es6中的写法

  • //1的情况 他是直接继承自Bar的原型的对象,Foo原型上有任何更改,都会作用于Bar的原型.

  • //2的情况 他是作为一个构造函数去继承,这样会产生副作用,他会继承Bar的构造函数。

  • //3的情况 这个就只是单纯的继承,不会出现副作用。

    //3 和 //2的区别就是 //2可以获得原型及实例的方法,但是//3只会获得原型链上的方法,不会获得实例上的方法。

这几种不能单纯的说好或者不好,毕竟每种都有他应用的场景。

具体可以参考(Prototypal) Inheritance

Last updated