JavaScript之ES5新特性

2024-03-20 22:20
文章标签 java 特性 script es5

本文主要是介绍JavaScript之ES5新特性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

this

function中的this——谁调用指向谁

1.注册在对象中的function里面的this

var obj = {a:10,fn(){console.log(this. a)}

注:对象中fn(){}是fn:function(){}的简写

obj.fn()//10

注册在对象内的方法一定由对象调用,所以fn中的this执向obj

2.注册在全局作用域中的function

var a = 10;
function fn(){console.log(this. A)
}
fn()//10

注:所有注册侧在全局的变量和方法都是window的属性,所以fn()的完全体是window.fn()里面的this指向window

3.回调函数与方法内的函数

只要是直接调用的方法(前面没有前缀),里面的this必定指向window

构造方法的继承

//父类:人
//构造函数
function Person(name,age){this.name = name;this.age = age;
}
//原型...//子类:程序员类
//构造函数
//程序员作为人的子类,人的属性程序员一定有
//需求:相同的属性,从父类继承,而不是自己声明
function Programmer(name,age,salary){//name,age继承自父类//Person(name,age)//因为直接调用的方法中的this指向window//所以name与age成为了window的属性//new Person(name,age)//new的作用是实例化出一个新对象,并把属性声明在新对象中//这个新对象在Person方法中并不是new p的到的性对象//问题出在Person的this指向中//解决:写在Programmer里面的this指向正确//只要让Person中的this指向Programmer中的this即可//强行改变this指向Person.call(this,name,age)//call的作用,执行方法//让方法中的this指向第一个参数//后面的参数是传递给原方法的实参//salary是程序员独有的属性,自己声明this.salary = salary;
}
var p = new Programmer('xiaoming',18,10000)
console.log(p)

 ES5新特性

严格模式

在这种模式下,JS语言需要更加严谨,一些不太严谨的写法会报错。

如何开启严格模式?

'use strict'//开启严格模式

禁止使用为声明的变量——禁止隐式声明

a=10;//严格模式下报错

静默失败升级为报错

var arr = [1, 2, 3, 4, 5];
console.log(arr.length)

删除length属性

delete arr.length
console.log(arr.length)

非严格模式下。删除失败,但是没有任何提示,即静默失败

严格模式下,报错,静默失败升级为报错

防递归

斐波那契额数列

function feb(n){//返回数列中的第n项的值if(n==1||n==2){return 1;}else{return feb(n-1)+feb(n-2);}
}console.log(feb(1))//1
console.log(feb(5))//5
function feb(n){//返回数列中的第n项的值if(n==1||n==2){return 1;}else{return arguments.callee(n-1)+arguments.callee(n-2);}
}console.log(feb(1))//严格模式下报错

对象属性

修改属性

var arr=new Array(1,2,3);
console.log(arr)
console.log(arr.length)//构造函数中的方法
console.log(arr.reverse())//原型上的方法//修改length属性
arr.length=8;//修改成功
console.log(arr.length)//8
//删除length属性
delete arr.length;//删除失败
console.log(arr.length)//8
//把arr看做对象,下标及length是属性名,用for...in遍历
for(var i in arr){console.log(arr[i])
}
//只能遍历出数字下标的值,length属性无法遍历//访问reverse方法
console.log(Array.prototype.reverse)
//修改
Array.prototype.reverse=100;//修改成功
console.log(Array.prototype.reverse)//100
//删除
delete Array.prototype.reverse;//删除成功
console.log(Array.prototype.reverse)//100
//遍历
for(var i in Array.prototype){console.log(Array.prototype[i])
}
//无法遍历

综上,对于对象的属性,我们有三个维度进行控制

分别是:是否可以修改,是否可以删除,遍历对象时是否可以遍历出来

三个维度

var obj = {a:10,b:20,
}
//对象的属性,都是可以修改以及遍历
//如何在这三个维度进行控制?
Object.defineProperty(obj,{a:{wirtable:false,//不可修改enumerable:false,//不可遍历configurable:false,//不可配置}
})
//参数1:对那个对象的属性进行控制
//参数2:控制配置项
console.log(obj.a)
obj.a = 100;//修改失败
console.log(obj.a)//10
for(var key in obj){console.log(key)
}//无法遍历a
delete obj.a//删除失败
console.log(obj.a)//10

如何理解不可配置?

实际开发中,项木内部的对象属性不能被客户修改

以属性b为例,本身不可修改,但是这个控制属性可以修改。

Object.defineProperty(obj,{b:{wirtable:true,//不可修改}
})
obj.b = 100;//修改成功
console.log(obj.b)//100

属性a设置了不可配置,就无法修改控制属性

Object.defineProperty(obj,{a:{wirtable:true//报错}
})

防止对象被篡改

级别1:不允许扩展对象
var obj={a:10,b:20,
}
Object.preventExtensions(obj)
obj.c=30//扩展失败
console.log(obj)//没有属性c
delete obj.b//删除成功
obj.a=40//修改成功
console.log(obj)
 级别2:不允许修改对象的属性
var obj={a:10,b:20,
}
Object.seal(obj)
obj.c=30//扩展失败
console.log(obj)//没有属性c
delete obj.b//删除失败
console.log(obj)
//这是一个较为常用的方法
//seal就是在preventExtensions给每一个属性添加不可配置
//要注意,在seal前要完成对属性的控制
级别3:冻结属性(属性和属性值都不可修改)
var obj={a:10,b:20,
}
Object.freeze(obj)
obj.c=30//扩展失败
delete obj.b//删除失败
obj.a=40//修改失败
console.log(obj)

这篇关于JavaScript之ES5新特性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830908

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定