- 有如下代码,解释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();
-
当new一个构造函数的时候会创建一个对象,p为通过new Person创建的对象,构造函数Person.prototype等于被创建的对象p的
__proto__
。 -
构造函数Person下的Person.prototype内的constructor指向此构造函数Person本身。
-
上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。
-
图中可知,
p.__proto__ === People.prototype
, 在对象p中没有的方法将会在p.__proto__
也就是People.prototype
下寻找;People.prototype.__proto__ === Object.prototype
,如果在People
的内部对象People.prototype
中没有的方法将会在People.prototype.__proto__
也就是Object.prototype
中寻找,最终toString
方法在Object.prototype
中找到,被对象p调用。 -
原型链:Javascript的原型链是内部对象链:每个被创建的函数都有一个
__proto__
, 都指向创建这个函数的'父函数'的内部对象xxx.prototype
。Object.prototype.__proto__
为最终点,指向null。 -
对String做扩展,实现如下方式获取字符串中频率最高的字符
//todo....
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因为d 出现了5次
//todo....
String.prototype.getMostOften = function(){
var str = this,
dict = {},
num = 0,
keyMax;
for(var i = 0; i < str.length; i ++){
if (dict[str[i]] === undefined) {
dict[str[i]] = 1;
} else {
dict[str[i]] ++;
}
}
for(var key in dict){
if(dict[key] > num){
num = dict[key];
keyMax = key;
}
}
return keyMax + ':' + num;
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因为d 出现了5次
- instanceOf有什么作用?内部逻辑是如何实现的?
- instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例。
var x = [a,b,c];
var y = {};
x instanceof Array // true
y instanceof Object // true
- 它的运算实质是检查右边构建函数的原型对象,是否在左边对象的原型链上。
p instanceof People// 等同于
People.prototype.isPrototypeOf(p)
- 内部原理:
function isObjInstanceOffunc(obj,func) {
var __proto__=obj.__proto__;
do{
if(__proto__===func.prototype) return true;
}while(__proto__=__proto__.proto__)
return false;
}
本博客版权归 本人和饥人谷所有,转载需说明来源
网友评论