摘要:属性是函数独有的,表明该对象可以被执行。李四张三张三李四李四李四张三属性探测由于属性可以在任何时候添加,所以有时候就有必要检查对象是否已有一个属性。张三属性特征通过方法来改变属性特征。
1.[[Call]]属性是函数独有的,表明该对象可以被执行。由于仅函数拥有该对象,ECMAScript定义typeof操作符对任何具有[[Call]]属性的对象返回“function”。
注:某些浏览器曾经在正则表达式中包含[[Call]]属性,导致后者被错误鉴别为函数。现在,所有的浏览器行为都一致,typeof不会再将正则表达式鉴别为函数。
2.函数具有两种字面形式。第一种为函数声明,第二种为函数表达式。这两种区别在于函数声明会提前,意味着可以先使用函数后声明。
// 函数声明 function add(num1, num2){ return num1 + num2; } // 函数表达式 var add = function(num1, num2){ return num1 + num2; };
3.array.sort()方法,默认将所有值转成字符串,再进行比较。
var array = [1, 2, 7, 4, 10]; array.sort(function(a, b){ return a - b; }); console.log(array); // [1, 2, 4, 7, 10] array.sort(); console.log(array); // [ 1, 10, 2, 4, 7 ]
4.call、apply和bind
注:call调用方式,func.call(this. arg1, arg2),apply调用方式,func.apply(this, [arg1, arg2]),bind返回一个函数。
var name = "李四"; var person = { name: "张三", sayName: function(){ console.log(this.name); } }; person.sayName(); // 张三 person.sayName.apply(window); // 李四 person.sayName.call(window); // 李四 var aaa = person.sayName; aaa(); // 李四 var aaa = person.sayName.bind(person); aaa(); // 张三
5、属性探测
由于属性可以在任何时候添加,所以有时候就有必要检查对象是否已有一个属性。以下模式探测是错误的。问题在于if判断中的值是一个对象、非空字符串、非零数字或true时,判断为真;而当值是一个null、undefined、0、false、NaN或空字符串时为假。由于一个对象属性可以包含这些假值,所以下面代码有可能会出现问题。更加可靠的判断属性是否存在应该是使用in操作符。in操作符在给定对象中查找一个给定名称的属性,如果找到则返回true。
if(peroson.age){ // do something }
在大多数时候,in操作符是最好的选择。但是当需要检查属性是自有属性还是原型属性时,则需要使用hasOwnProperty()方法。该方法在给定的属性存在且为自有属性时返回true。
6、属性枚举
所有可枚举的属性都可以通过for-in循环遍历。可枚举属性的内部特征[[Enumerable]]都被设置为true。
Object.keys()方法,可以某一对象的所有可枚举属性。
for-in循环返回的和Object.keys()返回的可枚举属性有一个区别。for-in循环同时也会遍历原型属性,Object.keys()只返回自有(实例)属性。
可以使用propertyIsEnumerable()方法检查一个属性是否为可枚举的。
var person = { name: "张三" }; person.propertyIsEnumerable("name") // true
7、属性特征
通过Object.defineProperty()方法来改变属性特征。Object.defineProperty()方法接受3个参数:拥有该属性的对象、属性名和包含需要设置的特征的属性描述对象。属性描述对象具有和内部特征同名的属性,但名字中不能包含中括号。所以可以用enumerable属性来设置[[Enumerable]]特征。
当使用Object.defineProperty()方法设置属性不可配置后,无法再次通过此方法设置为可配置。
通过Object.defineProperties()方法可以同时定义多个属性。该方法接收两个参数:需要改变的对象和一个包含所有属性信息的对象。
var person = {}; Object.defineProperties(person, { _name: { value: "张三", enumberable: true, configurable: true, writable: true }, name: { get: function(){}, set: function(){} } })
通过Object.getOwnPropertyDescriptor()方法可以获取属性特征。该方法接收两个参数:对象和属性名。如果属性存在,则返回一个属性描述对象。
Object.preventExtensions()创建一个不可扩展的对象。该方法接收一个参数,就是对象。通过Object.isExtensible()来检查[[Extensible]]的值。
Object.seal()封印对象。封印的对象是不可扩展的且所有属性都不可配置。通过Object.isSealed()判断对象是否被封印。
Object.freeze()冻结对象。冻结的对象是一个数据属性都为只读的被封印对象,被冻结对象无法解冻。通过Object.isFrozen()判断对象是否被冻结。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/83637.html
摘要:深入之继承的多种方式和优缺点深入系列第十五篇,讲解各种继承方式和优缺点。对于解释型语言例如来说,通过词法分析语法分析语法树,就可以开始解释执行了。 JavaScript深入之继承的多种方式和优缺点 JavaScript深入系列第十五篇,讲解JavaScript各种继承方式和优缺点。 写在前面 本文讲解JavaScript各种继承方式和优缺点。 但是注意: 这篇文章更像是笔记,哎,再让我...
摘要:但是有一个总的原则,那就是指的是调用函数的那个对象。作为构造函数调用如果在一个函数前面带上来调用,那么背地里将会创建一个链接到该函数的成员的新对象,同时会被绑定到那个新对象上。使用或调用方法让我们构建一个参数数组传递给调用函数。 让我们深入探索一下this的具体用法 只有了解this用法才算真正入门了 showImg(https://segmentfault.com/img/bVYh1...
摘要:如下所示在规范中,已经正式把属性添加到规范中也可以通过设置和获取对象的原型对象对象之间的关系可以用下图来表示但规范主要介绍了如何利用构造函数去构建原型关系。 前言 在软件工程中,代码重用的模式极为重要,因为他们可以显著地减少软件开发的成本。在那些主流的基于类的语言(比如Java,C++)中都是通过继承(extend)来实现代码复用,同时类继承引入了一套类型规范。而JavaScript是...
摘要:理解作用域高级程序设计中有说到对象是在运行时基于函数的执行环境绑定的在全局函数中,等于,而当函数被作为某个对象调用时,等于那个对象。指向与匿名函数没有关系如果函数独立调用,那么该函数内部的,则指向。 理解this作用域 《javascript高级程序设计》中有说到: this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,t...
摘要:深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。定义对闭包的定义为闭包是指那些能够访问自由变量的函数。 JavaScript深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。 定义 MDN 对闭包的定义为: 闭包是指那些能够访问自由变量的函数。 那什么是自由变量呢? 自由变量是指在函数中使用的,但既不是函数参数也...
阅读 809·2021-11-22 11:59
阅读 3193·2021-11-17 09:33
阅读 2289·2021-09-29 09:34
阅读 1921·2021-09-22 15:25
阅读 1908·2019-08-30 15:55
阅读 1304·2019-08-30 15:55
阅读 514·2019-08-30 15:53
阅读 3322·2019-08-29 13:55