this 相关问题
问题1: apply、call 、bind有什么作用,什么区别
function foo(a, b) {
console.log("a:" + a + ",b:" + b + ",c:" + this.c)
}
var obj1 = {
c: 3
}
var obj2 = {
c: 4
}
foo.call(obj1, 1, 2)
foo.apply(obj2,[1,2])
var bar = foo.bind(obj1)
bar(1,2)
apply和call的第一个参数为调用函数式指定的this
apply的arguments每个依次列出
call的arguments是一个数组形式
call()和apply()方法会直接调用函数
bind()更常用在为回调函数指定this,bind()不会直接执行函数,而是返回一个新函数
第一个参数为调用函数式指定的this,其他参数可以在函数被调用时再写入
(!!!以下问题主要根据《你不知道的JS》中的this绑定规则回答)
问题2: 以下代码输出什么?
输出John: hi!
因为属于隐式绑定,把sayHi的this绑定到变量john上
问题3:下面代码输出什么,为什么
[object Window]
默认绑定
问题4:下面代码输出什么
#document
window
事件的this和e.currentTarget相同,即被绑定事件的元素
定时器事件的this有上下文对象,但因为没有立即执行,丢失了与上下文对象的绑定,应用默认绑定
问题5:下面代码输出什么,why
输出john
显示绑定
问题6: 以下代码有什么问题,如何修改
事件的this和e.currentTarget相同,即被绑定事件的元素$btn
应在事件绑定之前把this显示赋值给一个变量
var module= {
bind: function(){
var self = this
$btn.on('click', function(){
console.log(this) //this指什么
self.showMsg();
})
},
showMsg: function(){
console.log('饥人谷');
}
}
原型链相关问题
问题7:有如下代码,解释Person、 prototype、proto、p、constructor之间的关联。
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();

问题8: 上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。
p的方法toString
继承自Object
每个对象都有一个内部链接到另一个对象,称为它的原型 prototype。该原型对象有自己的原型,等等,直到达到一个以null为原型的对象。根据定义,null没有原型,并且作为这个原型链 prototype chain中的最终链接。JS对象实现继主要是依靠原型链来实现,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。
问题9:对String做扩展,实现如下方式获取字符串中频率最高的字符
String.prototype.getMostOften = function() {
self = this.trim()
var countObj = {},
max = {
val: '',
count: 0
}
for (let i = 0;i<self.length;i++) {
if (!countObj[self[i]]) {
countObj[self[i]] = 1
} else {
countObj[self[i]]++
}
if (countObj[self[i]] > max.count) {
max.val = self[i]
max.count = countObj[self[i]]
}
}
return max.val
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch);
问题10: instanceOf有什么作用?内部逻辑是如何实现的?
instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
内部逻辑可以用以下代码表示:
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
继承相关问题
问题11:继承有什么作用?
function Dog(name){
this.name = name;
}
Dog.prototype = { species : '犬科' };
var dogA = new Dog('大毛');
var dogB = new Dog('二毛');
alert(dogA.species); // 犬科
alert(dogB.species); // 犬科
实例对象从原型中继承共享的方法和属性
a. 可以优化代码结构和对象关系,当需要修改共享的属性或方法时,只需修改原型里的属性或方法即可
b. 可以优化内存空间。所有实例共享的属性和方法,其实都是同一个内存地址,指向prototype对象,因此就提高了运行效率。
问题12: 下面两种写法有什么区别?
方法一:
对于每一个实例对象,printName()方法都是一模一样的内容。
每一次生成一个实例,都会产生重复的内容,浪费内存空间。
方法二:
对于每一个实例对象,其printName()方法都是同一个内存地址,即指向prototype对象,节省空间,提高运行效率。
问题13: Object.create 有什么作用?兼容性如何?
Object.create()
方法使用指定的原型对象和其属性创建了一个新的对象。
Object.create(proto, [ propertiesObject ])
var s = {a:1}
var w = Object.create(s)
w.__proto__ === s
ES5语法
兼容IE9+
问题14: hasOwnProperty有什么作用? 如何使用?
hasOwnProperty()
方法会返回一个布尔值,指示对象是否具有指定的属性作为自身(不继承)属性。
var s = new Object()
s.propo = 'ownProp'
console.log(s.hasOwnProperty('propo'))
console.log(s.hasOwnProperty('toString'))
console.log(s.hasOwnProperty('valueOf'))
问题15:如下代码中call的作用是什么?
function Person(name, sex){
this.name = name;
this.sex = sex;
}
function Male(name, sex, age){
Person.call(this, name, sex); //这里的 call 有什么作用
this.age = age;
}
使用call()方法,将Person的属性和方法绑定到Male上,即Male可以继承Person的属性和方法
问题16: 补全代码,实现继承
function Person(name, sex){
this.name = name
this.sex = sex
}
Person.prototype.printName = function(){
console.log('The name is '+this.name)
};
function Male(name, sex, age){
Person.call(this, name, sex)
this.age = age
}
Male.prototype = new Person()
Male.prototype.constructor = Male
Male.prototype.getAge = function(){
console.log('The age is '+this.age)
};
var ruoyu = new Male('若愚', '男', 27);
ruoyu.printName();
网友评论