继承有什么作用?
- 得到一个类的属性
- 得到一个类的方法
有几种常见创建对象的方式? 举例说明?
直接赋值
var obj={};
工厂模式
function createCake(name){
var obj={
name:name,
sayName:function(){
console.log('我是:'+name)
}
}
return obj;
}
var cake1= createCake('草莓蛋糕')
缺点是无法得到对象类型
- 构造函数模式
function createCake(name){
this.name=name;
this.sayName=function(){
console.log('我是:'+this.name);
}
}
var cake1= new createCake('草莓蛋糕')
- 原型方式
function createCake(name){
this.name=name;
}
createCake.prototype.sayName=function(){
console.log('我是:'+this.name);
}
var cake1= new createCake('草莓蛋糕')
下面两种写法有什么区别?
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);
方法一是构造函数模式,方法二是原型模式。方法二算是方法一的一种改进,把共有的属性放在了原型当中,节省空间。
Object.create 有什么作用?兼容性如何?如何使用?
Object.create
创建一个拥有指定原型和若高个指定属性的对象
ES5新特性,需要IE9以上版本
hasOwnProperty有什么作用? 如何使用?
可以判断一个对象是否包含自定义属性而不是原型链上的属性,hasOwnProperty
是JS中唯一一个处理属性但是不查找原型链的函数。
实现Object.create的 polyfill,如:(ps: 写个 函数create,实现 Object.create 的功能)
var obj = {a: 1, b:2};
var obj2 = create(obj);
console.log(obj2.a); //1
if (typeof Object.create != 'function'){
Obj.create = (function(){
function Temp() {}
var hasOwn = Object.prototype.hasOwnProperty;
return function(proto){
if (typeof proto != 'object'){
throw TypeError('Object prototype may only be an Object or null');
}
Temp.prototype = proto;
var obj = new Temp();
Temp.prototype = null;
if (arguments.length > 1){
var Properties = Object(arguments[1]);
for (var prop in Properties){
if (hasOwn.call(Properties, prop)) {
obj[prop] = Properties[prop];
}
}
}
return obj;
};
})();
}
如下代码中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;
}
改变this的指向,把环境改变到Male的环境内,实现继承。
补全代码,实现继承
function Person(name, sex){
// todo ...
}
Person.prototype.getName = function(){
// todo ...
};
function Male(name, sex, age){
//todo ...
}
//todo ...
Male.prototype.getAge = function(){
//todo ...
};
var ruoyu = new Male('若愚', '男', 27);
ruoyu.printName();
function inhert(superType,subType){
var _prototype = Object.create(superType.prototype);
_prototype.constructor=subType;
subType.prototype=_prototype;
}
function Person(name,sex){
this.name=name;
this.sex=sex;
}
Person.prototype.getName=function(){
console.log(this.name);
}
function Male(name,sex,age){
Person.call(name,sex);
this.age=age;
}
inhert(Person,Male);
Male.prototype.getAge=function(){
console.log(this.age);
}