为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript深入浅出

Bosn 资深架构师
难度中级
时长 5小时28分
学习人数
综合评分9.60
492人评价 查看评价
9.8 内容实用
9.5 简洁易懂
9.5 逻辑清晰
  • object 和number,string对比会先转换成原始对象

    boolean会先转换成number'


    查看全部
  • 在包装对象被使用完后,会被销毁,所以str.t事实上变成了new string(str).t这个t在包装类型中是不存在的,所以结果是undefined

    查看全部
  • ,运算符取最后一个

    查看全部
  • extensible标签表示对象的扩展性

    查看对象是否可扩展:Object.isExtensible(obj)

    阻止对象扩展:Object.preventExtensions(obj)

        如果使用了Object.preventExtensions(obj), obj的属性的标签并没有改变

    隐藏对象:Object.seal(obj)

        使得对象不可扩展并且把对象属性的标签中的configurable改为false

    对象是否被隐藏: Object.isSealed(obj)

    冻结对象: Object.freeze(obj)

        使得对象不可扩展并且把对象属性的标签中的configurable和writable都改为false

    对象是否被冻结: Object.isFrozen(obj)

    最后要注意的一点就是,对某一个对象做这些修改的操作,并不影响原型链!


    查看全部
  • class标签表示对象的类型

    我们无法直接获得class标签

    但是可以通过Object.prototype.toString.call(this)的方法获得一个数组,数组的内容就是对象的类型


    本页的例题中

    getType无论传入的是数字还是布尔值,都会被当成对象来看待

    这是因为Object.prototype.toString会先把数字或者布尔值转换为对象

    查看全部
  • 不仅是对象的属性有标签

    对象本身也有标签

    [[proto]]

    [[class]]

    [[extensible]]

    查看全部
  • 属性标签的修改规则:(如图)


    补充:

    只要configurable为true,基本上什么都可以修改

    任何情况下都允许将writable标签由true改为false

    查看全部
  • 同时对一个对象定义多个属性的标签可以使用

    Object.defineProperties(对象, {

        property1 : {},

        property2 : {},

        property3 : {}

    });

    的方法

    查看全部
  • 通过

    Object.keys(对象)

    的方法来查找某个对象里的属性

    如果某个属性的enumerable值为false

    则Object.keys(对象)将不会输出这个属性

    查看全部
  • 使用

    Object.getOwnPropertyDescriptor(对象,属性)

    的方法来查看对象内某个属性的标签的情况

    如果属性不存在,返回undefined,存在则返回标签的情况。


    设置属性的标签

    Object.defineProperty(obj, 'name', {

        configurable : true,

        writable : false,

        enumerable : true,

        value : "Blueine"

    });

    查看全部
  • 清晰明了

    查看全部
    0 采集 收起 来源:prototype属性

    2018-05-12

  • 在包装对象被使用完后,会被销毁,所以str.t事实上变成了new string(str).t这个t在包装类型中是不存在的,所以结果是undefined

    查看全部
  • 当把一个基本类型尝试以对象的方式去使用的时侯,javascript会先创建一个基本类型对应的包装类型对象以支持使用,所以在str.length底层是new string<str>.length所以结果是6,而str.t=6事实上是new String(6).t=6,


    查看全部
  • 不只是上述foo.prototype.z有get方法的情况无法通过赋值修改原型链上z的值

    如果新定义一个对象,对这个对象添加一个属性,并设置它的值为1

    由于没有设置这个属性的其他标签,所以writable标签为false,表示这个属性不可修改

    当我们用Object.create()的方法创建一个新对象时

    新对象的proto指向传入Object.create()的形参

    假设传入的形参是我们前面提到的那个对象

    那么在新对象的基础上可以引用到原型链的属性

    但是由于writable为false

    企图通过新对象对原型链的属性赋新值是不可以的

    除非是在新对象上使用Object.defineProperty()来新建一个新对象自己的属性

    (但是始终要注意,Object.defineProperty()里面属性标签的默认值都是false!)

    查看全部
  • 假设原型链上有某个属性,而由构造器构造的对象没有这个属性

    即function foo() {};  var obj = new foo();

    foo.prototype有属性z,  z in foo.prototype //true

    而obj没有直接拥有属性z,  obj.hasOwnProperty(z) //false

    如果原型链上的属性具有get方法

    即Object.defineProperty(foo.prototype, 'z', {get: function() {return 1;} })

    那么z的值就是1

    当我们试图给foo.prototype的z赋值时

    js解释器并不会在obj里新建一个属性z (按道理,没有get时obj会在自己的属性里新建一个z)

    也就是说,这个时候, foo.prototype.z由于有get方法而我们无法直接修改z的值

    想要对obj添加z这个属性,而不是使用原型链上的foo.prototype.z

    就要使用

    Object.defineProperty(obj, 'z', {value: 100, configurable: true})

    的方法

    在我们删除了obj里的z属性之后

    再次运行obj.z我们得到的还是原型链上的foo.prototype.z

    查看全部

举报

0/150
提交
取消
课程须知
1.您至少学习了本站“JS入门”、“JS进阶”两门基础课程。 2.如您具备一定实践经验对学习有很大帮助。 3.如您没有脚本编程开发经验,学习过程有可能会受挫部分内容或示例代码,请“暂时略过不懂的部分,后面章节会阐述”,当然想透彻学习,还需大量实践来体会知识的内涵。
老师告诉你能学到什么?
结合实例,深入解析以下知识内容: 1. 数据类型、表达式和运算符、语句; 2. 对象、数组、变量、函数; 3. this、闭包和作用域; 4. OOP; 5. 正则与模式匹配。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!