当然,我是一个javascript noob(充其量).以下代码似乎工作正常.任何想法如何保持相同的"初始化程序"方法,并使其工作,而无需使用__proto__和不转换所有内容到构造函数?
var Employee =
{
paygrade: 1,
name: "",
dept: "general",
init: function()
{
return this;
},
salary: function()
{
return this.paygrade * 30000;
}
};
var WorkerBee =
{
paygrade: 2,
projects: ["Project1", "Project2"],
init: function()
{
this.__proto__ = Inherit_Employee; // Inherit My Employee "Pseudo Prototype"
return this;
}
};
var SalesPerson =
{
dept: "Sales",
quota: 100,
init: function()
{
this.__proto__ = Inherit_WorkerBee; // Inherit My WorkerBee "Pseudo Prototype"
return this;
}
};
var Engineer …Run Code Online (Sandbox Code Playgroud) 我使用以下函数从一组参数创建JavaScript中的函数实例:
var instantiate = function (instantiate) {
return function (constructor, args, prototype) {
"use strict";
if (prototype) {
var proto = constructor.prototype;
constructor.prototype = prototype;
}
var instance = instantiate(constructor, args);
if (proto) constructor.prototype = proto;
return instance;
};
}(Function.prototype.apply.bind(function () {
var args = Array.prototype.slice.call(arguments);
var constructor = Function.prototype.bind.apply(this, [null].concat(args));
return new constructor;
}));
Run Code Online (Sandbox Code Playgroud)
使用上面的函数,您可以按如下方式创建实例(请参阅小提琴):
var f = instantiate(F, [], G.prototype);
alert(f instanceof F); // false
alert(f instanceof G); // true
f.alert(); // F
function F() { …Run Code Online (Sandbox Code Playgroud) 我有一个构造函数Monkey():
function Monkey(name, age) {
this.name = name;
this.age = age;
}
Run Code Online (Sandbox Code Playgroud)
我想创建另一个以Human()额外属性命名的构造函数,该属性cars将存储该人拥有的汽车数量以及Monkey具有(如和)的所有属性nameage
我不想重复Monkey新Human内容中的所有内容.是可以克隆Monkey并与扩展属性的原型?
我试图找出如何从另一个实例化的对象实例化一个新对象,而无需使用new运算符.以下代码有效,但我听说__proto__属性已折旧.
var MyObject = function( arg ) {
this.value = arg;
};
MyObject.prototype.getValue = function() {
return this.value;
};
// Standard way of instantiating an object
var object1 = new MyObject( 'foo' );
// Creating new object based on another without using new operator
var object2 = {};
object2.__proto__ = object1.__proto__
object1.constructor.call( object2, 'bar' );
console.log( object1 );
console.log( object2 );
Run Code Online (Sandbox Code Playgroud)
那么如果没有__proto__属性我该如何做呢?