This 原型链 继承
this相关
- apply call bind有什么作用,什么区别?
语法
fun.call(thisArg, arg1, arg2, ...)
call()
方法调用一个函数, 其具有一个指定的this值和分别提供的参数。
可以让call()
中的对象调用当前对象所拥有的function
。你可以使用call()
来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。
apply()
方法与call()
类似,只有一个区别,就是call()
方法接受的是若干个参数的列表,而apply()
方法接受的是一个包含多个参数的数组。
bind()
方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值
- 以下代码输出什么
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()
输出john:hi!
,因为john.sayHi()
的this
指向对象john
- 下面代码输出什么,为什么
func()
function func() {
alert(this)
}
func()
等同于window.func()
所以this
指向window
- 下面代码输出什么
document.addEventListener('click', function(e){
console.log(this); // 此处this指的是绑定事件的对象,即document
setTimeout(function(){
console.log(this); //setTimeout定时器中的this默认是window,所以此处this为window
}, 200);
}, false);
- 下面代码输出什么
var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john) //输出 john,因为call()方法将传入的john对象作为this
- 以下代码有什么问题,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //this指什么
this.showMsg();
})
},
showMsg: function(){
console.log('饥人谷');
}
}
// 上述代码中的this代表绑定事件的$btn元素,而$btn是没有showMsg()的,
// 修改方法:将this重新定义,使方法有效↓
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //this指什么
this.showMsg();
}.bind(this))
},
showMsg: function(){
console.log('饥人谷');
}
}
原型链相关
- 有如下代码,解释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();
// Person 是构造函数
// P是用Person构造函数所创建的实例
// Person.prototype是构造函数的原型对象
// Person.prototype.constructor === Person
// P.__proto__ 指向Person.prototype
// P.constructor 也指向Person构造函数
-
上例中,对对象 p可以这样调用 p.toString();toString是哪里来的? 画出原型图?并解释什么是原型链。
当对象P没有toString()时,他会在_proto_中寻找,没有的话继续沿着_proto_向上,直到在原始对象Object中找到了toString方法,由_proto_一层一层构成的链接,就叫原型链 -
对String做扩展,实现如下方式获取字符串中频率最高的字符
String.prototype.getMostOften = function(){
var obj = {},max = 0, maxChar;
for(var i = 0;i<this.length;i++){
var char = this.charAt(i);
if(obj[char]){
obj[char]++;
}else{
obj[char] = 1;
}
}
for(var key in obj){
if(obj[key]>max){
max = obj[key];
maxChar = key;
}
}
return maxChar;
};
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d
- instanceOf有什么作用?内部逻辑是如何实现的?
instanceOf 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性
使用instanceOf会沿着对象的原型链去寻找constructor属性,来判断是否指向某个构造函数,返回true OR false
继承相关
-
继承有什么作用?
继承可以使一个对象使用另一个对象的属性和方法 - 下面两种写法有什么区别?
//方法1
function People(name, sex){
this.name = name;
this.sex = sex;
this.printName = function(){
console.log(this.name);
}
}
var p1 = new People('饥人谷', 2)
//方法2
function Person(name, sex){
this.name = name;
this.sex = sex;
}
Person.prototype.printName = function(){
console.log(this.name);
}
var p1 = new Person('若愚', 27);
用第一种构造函数所创建的实例所使用的printName方法是独立的,单独储存的,占用资源较大
第二种将printName方法写到prototype中,使所有创建的实例能够共享此方法,节省内存,提高性能
- Object.create 有什么作用?兼容性如何?
Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象
可用于实现原型属性、方法的继承
兼容:
chrome 5,Edge,Firefox 4,IE 9,Opera 11.6,Safari 5
- hasOwnProperty有什么作用? 如何使用?
作用:hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性
语法:obj.hasOwnProperty(prop)
- 如下代码中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;
}
再Male构造函数中通过call()方法引入person函数,可以使用Person的属性、方法,实现了继承
- **补全代码,实现继承 **
function Person(name, sex){
this.name = name;
this.sex = sex;
}
Person.prototype.getName = function(){
return this.name;
};
Person.prototype.printName = function(){
console.log(this.name);
};
function Male(name, sex, age){
this.age = age;
Person.call(this,name, sex)
}
Male.prototype = Object.create(Person.prototype)
Male.prototype.constructor = Male
Male.prototype.getAge = function(){
console.log(this.age);
};
var ruoyu = new Male('若愚', '男', 27);
ruoyu.printName();