1 new Object()创建
先定义一个构造函数,并定义构造函数的原型方法
var Dog = function (name,age) {
this.name = name;
this.age = age;
}
Dog.prototype.bark = function () {
console.log("wang wang")
}
Dog.prototype.sayName = function () {
console.log("my name is:"+this.name+" age:"+this.age);
}
let erha = new Dog('二哈',2)
erha.bark()
erha.sayName()
// new 的作用
// 创建一个新对象 obj
// 把obj的__proto__指向Dog.prototype 实现继承
// 执行构造函数,传递参数,改变this指向 Dog.call(obj,...args)
// 最后把obj的值传回 给jinmao
var _new = function () {
// console.log(arguments) // [Arguments] { '0': [Function: Dog], '1': 'jinmao', '2': 1 }
let construct = Array.prototype.shift.call(arguments); // [Function: Dog]
let args = arguments;// [Arguments] { '0': 'jinmao', '1': 1 }
const obj = new Object()
obj.__proto__ = construct.prototype;
construct.call(obj,...args);
return obj;
}
var jinmao = _new(Dog,'jinmao',1);
jinmao.bark()
jinmao.sayName()
console.log(jinmao instanceof Dog)
// wang wang
// my name is:二哈 age:2
// wang wang
// my name is:jinmao age:1
// true
2 Object.create()创建
var Dog = function (name,age) {
this.name = name;
this.age = age;
}
Dog.prototype.bark = function () {
console.log("wang wang")
}
Dog.prototype.sayName = function () {
console.log("my name is:"+this.name+" age:"+this.age);
}
let erha = new Dog('二哈',2)
erha.bark()
erha.sayName()
function _new1(fn,...args) {
const obj = Object.create(fn.prototype)
const ret = fn.call(obj,...args);
return ret instanceof Object ?ret:obj;
}
var jinmao = _new1(Dog,'jinmao',1);
jinmao.bark()
jinmao.sayName()
console.log(jinmao instanceof Dog)
// wang wang
// my name is:二哈 age:2
// wang wang
// my name is:jinmao age:1
// true