1.说说Javascript中对象的几种创建模式
- 对象-继承-面向对象
- 创建对象第一个想到的关键字是
new
- 创建对象的目的是实现
继承
,继承部分通用属性 - 问题可以转换成 : JavaScript如何实现对象的继承,继承的形式
- 创建对象第一个想到的关键字是
-
构造函数
- 首先定义一个构造函数,可以传入构造参数,demo如下:
function Student(name,sex){ this.name = name this.sex = sex this.sayName = function(){ console.log(this.name) } } var student_1 = new Student('张三','male')
- 限制和优势
- 首先定义一个构造函数,可以传入构造参数,demo如下:
- 快速批量创建对象的 工厂模式
- 使用一个工厂函数,入参接受构造参数,返回创建的对象,避免重复的
new
关键字function factory(name,sex){ var obj = new Object() obj.name = name obj.sex = sex obj.sayName = function(){ console.log(this.name) } return obj } var person_1 = factory('zhangsan','male') var person_2 = factory('lisi','female')
- 限制和优势
- 生成相似的同类对象避免多次重复的
new
关键字 - 限制:只能构造同类元素
- 生成相似的同类对象避免多次重复的
- 使用一个工厂函数,入参接受构造参数,返回创建的对象,避免重复的
- 避免重复属性性能浪费的 原型模式
-
每个函数都有一个原型属性指针
prototype
,指向一个原型对象,所有实例的该属性指向同一个对象,并不会重复创建对象,所以再原型对象里面添加属性,可以避免实例重复创建对象的性能浪费
```:javacsript
function student_proto(){} student_proto.prototype.sayNme = funciton(){ console.log(this.name) } student_proto.prototype.sex = 'male' student_proto.prototype.name = 'zhangsan' var student_1 = new student_proto() ```
-
- 组合使用 原型模式和构造函数
-
动态原型模式
- 原理:还是把所有的信息都封装在构造函数里面,但是为了避免方法的重复定义和性能损耗,在定义重复方法之进行了一个判断,如果this.function 已经存在则不在进行重复定义,如果不存在,将原型链上添加上该方法
- demo
function Person(name,age,job){ //属性 this.name = name; this.age = age; this.job = job; //方法 if (typeof this.sayName != "function"){ Person.prototype.sayName = function(){ alert(this.name); }; } } var friend = new Person("Nicholas",29,"Software Engineer"); friend.sayName();
-
寄生构造函数模式
-
原理:Javascript 中构造函数如果有返回值的情况会怎么样
- 无返回值: 实例为正常实例化对象
- 有返回值但是返回值为非引用类型:实例为正常实例化对象
- 有返回值并且返回值为引用类型:实例为返回值引用对象
-
所谓寄生构造函数就是创建一个函数,然这个函数只是封装创建对象的代码,然后再返回新创建的对象。
```:javascript function Person(name,job){ var o = new object(); o.name = name; o.age=age; o.job=job; o.sayName = function(){ alert(this.name) } return o; } var friend = new Person(name1,age1,job1) friend.sayName(); // name1 ```
-
Javascript中如何实现异步编程
Javascript 的同源策略
- 概念:JavaScript只能读取和所属文档同源的窗口和文档的属性
- 判断来源:指脚本本身的来源并不作为同源依据,而是指脚本所属文档的来源作为判断依据
- 同源:协议,主机,端口必须全部相同
为什么JavaScript会有同源策略限制
- 避免跨域跨来源的安全问题
为什么说Function函数在JavaScript中是第一类对象
- 函数拥有对象能做的一切能力
JavaScript中函数声明和函数表达式的区别
JavaScript如何删除cookie中的一个键值对
- 原理:
手写一个方法求字符串的字节长度
attribute 和 property的区别
-
attribute
: 特性,特性节点(attribute node
),每个dom
节点都有有个attribute
属性用来存储特定的attribute node
属性节点 -
property
:属性,每个dom节点,如果当作普通Object看,property就是存储在Object中的一个键值对 - 设置方法不一样:
attribute
需要setAttribute
方法设置,property
直接.
语法设置 - 删除方式不一样:
attribute
需要removeAttribute
方法设置,property
则是使用Object
的delete
方法
@H_302_403@延时脚本在JavaScript中的作用
-
defer
和async
属性对脚本加载的意义不一样 - 相同点: 都会使脚本的加载过程不阻碍html的解析
- 不同点:
defer
延时即使脚本加载完成,也会等待html解析完毕再执行脚本,而async
则是异步加载脚本,脚本一加载完成则会立即执行脚本,可能还是会阻碍html解析 - 相同作用:都是为了更好的html体验,减少白屏时间,优化用户体验
闭包是什么,闭包的优缺点
如何判断一个对象是否属于一个类
-
instanceof
-
object
instanceof
Object
右边参数是否存在左右对象的原型链上,存在返回 true 不存在返回 false
-
-
constructor
是否存在一个函数,只在当前对象查找属性,不会顺原型链查找
document.write和innerHTML的区别
在JavaScript中读取文件的方法是什么
- JavaScript环境区分
- node环境:
- fs 库
// 1. 使用 require 方法加载 fs 核心模块 var fs = require('fs') // 2. 读取文件 // 第一个参数就是要读取的文件路径 // 第二个参数是一个回调函数 // 成功 // data 数据 // error null // 失败 // data undefined没有数据 // error 错误对象 fs.readFile('read.txt',function (error,data) { // 在这里就可以通过判断 error 来确认是否有错误发生 if (error) { console.log('读取文件失败了') } else { console.log(data.toString()) } })
- 浏览器环境:
function readAjaxFile(url) { // 创建xhr var xhr = new XMLHttpRequest(); // 监听状态 xhr.onreadystatechange = function() { // 监听状态值 if(xhr.readyState === 1 && xhr.status === 200) { console.log(xhr.responseTest) } } // 打开请求 xhr.open('GET',url,true) // 发送数据 xhr.send(null) }
let file = document.queryselector('file-input')[0].file[0] let reader = new FileReader() reader.readAsText(file) reader.onload = function(data) { console.log(data,this.result); }
- node环境: