- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不知道更好的标题,所以解释一下,假设你有一个“构造函数”
因此,当第一个对象属性 num
更改时,其他对象原型(prototype)属性 num
也应该改变
这当然适用于 num
的情况
但是如果 num
是数字或字符串
如果num
在第一个对象中被覆盖,因为原始变量作为值而不是通过引用传递,或者如果属性是一个对象并且将被用新对象覆盖
所以我的问题是是否有任何“巧妙”的方法可以让一个对象从另一个对象继承属性的原始值,并让它们共享一个引用?
这里是一些示例代码,您可以跳过第一个,这里是为了代码的完整性
/* Inheritance Helper*/
var base = (function baseConstructor() {
var obj = {
create:function instantiation() {
if(this != base) {
var instance = Object.create(this.pub);
this.init.apply(instance,arguments);
this.instances.push(instance);
return instance;
} else {
throw new Error("You can't create instances of base");
}
},
inherit:function inheritation() {
var sub = Object.create(this);
sub.pub = Object.create(this.pub);
sub.sup = this;
return sub;
},
initclosure:function initiation() {},
instances: [],
pub: {}
};
Object.defineProperty(obj,"init",{
set:function (fn) {
if (typeof fn != "function")
throw new Error("init has to be a function");
if (!this.hasOwnProperty("initclosure"))
this.initclosure = fn;
},
get:function () {
var that = this;
//console.log(that)
return function() {
if(that.pub.isPrototypeOf(this)) //!(obj.isPrototypeOf(this) || that == this))
that.initclosure.apply(this,arguments);
else
throw new Error("init can't be called directly");
};
}
});
Object.defineProperty(obj,"create",{configurable:false,writable:false});
Object.defineProperty(obj,"inherit",{configurable:false,writable:false});
return obj;
})();
/*Helpers*/
function merge (obj) {
if(arguments.length < 2)
throw new Error({msg:"At least 2 parameters needed"});
for ( var i = 1, ilen = arguments.length;i < ilen; i++)
for (var k in arguments[i])
obj[k] = arguments[i][k];
}
/*Helpers for workarounds*/
function tieProp (prop,obj) {
if(arguments.length < 3)
throw new Error({msg:"At least 2 Objects are needed"});
var ref = obj[prop];
for ( var i = 1,ilen = arguments.length;i<ilen;i++)
Object.defineProperty(arguments[i],prop,{
set: function (val) {
ref = val;
},
get: function () {
return ref;
}
});
}
所以,这是创建对象的部分
/*Example Code*/
var Series = base.inherit();
Series.init = function (specs) {
var _Series = this;
specs = specs ||{};
this.seasons = [];
var Season = Series.inherit();
Season.init = function(specs) {
var _Season = this;
specs = specs || {};
_Series.seasons.push(this);
merge(this,specs);
};
merge(this,specs);
Season.pub.score = this.score; // First way
Season.pub.stats = this.stats; // Second Way
tieProp("scoreTied",this,Season.pub); //Third Way
Season.pub.scoreSetter = this.scoreSetter; // Second Way
this.updateScore = function (score) { // Forth Way
this.scoreSetter = score;
Season.pub.scoreSetter = score;
};
tieProp("someObj",this,Season.pub); //Obj Example
this.addSeason = function (specs) {
Season.create(specs);
};
};
Series.pub.toString = function () {
return this.title + " has a score of " + this.scoreTied ;
};
var Futurama = Series.create({
title:"Futurama",
score:1, // 1.
scoreTied:2, // 2.
stats:{ //3.
score:3
},
scoreSetter:4,
someObj:{a:"b"}
});
Futurama.addSeason();
让我们在更改属性之前记录控制台输出
console.log("BeforeChange",Futurama.score + " - " + Futurama.seasons[0].score); //"1 - 1"
console.log(Futurama.scoreTied + " - " + Futurama.seasons[0].scoreTied); // "2 - 2"
console.log(Futurama.stats.score + " - " + Futurama.seasons[0].stats.score); // "3 - 3"
console.log(Futurama.scoreSetter + " - " + Futurama.seasons[0].scoreSetter); //"4 - 4"
console.log(JSON.stringify(Futurama.someObj) + " - " + JSON.stringify(Futurama.seasons[0].someObj)); //"{"a":"b"} - {"a":"b"}"
然后更改Futurama
的乐谱属性
Futurama.score = 2; //TFirst way // This will fail
Futurama.scoreTied = 3; //Second way
Futurama.stats.score = 4; // Third way
Futurama.updateScore(5); // Forth Way
Futurama.someObj = {b:"a"}; // Object replacement
并记录它们
console.log("After Change",Futurama.score + " - " + Futurama.seasons[0].score); // 2 - 1
console.log(Futurama.scoreTied + " - " + Futurama.seasons[0].scoreTied); // 3 - 3
console.log(Futurama.stats.score + " - " + Futurama.seasons[0].stats.score); //4 -4
console.log(Futurama.scoreSetter + " - " + Futurama.seasons[0].scoreSetter); //5 - 5
console.log(JSON.stringify(Futurama.someObj) + " - " + JSON.stringify(Futurama.seasons[0].someObj)) ; //"{"b":"a"} - {"b":"a"}"
所以,当使用时这是可能的
就像 function tieProp (prop,obj) {...
但我不知道在这种情况下使用 Object.defineProperty 是否合适,我是否真的必须设置属性描述符才能让某些属性共享对原始值的一个引用?
就像Season.pub.stats = this.stats;//第二种方式
这没问题,但我对此不太满意,因为我必须将属性移动到另一个属性中,这会剥夺一些命名自由,在这个例子中,我想要 score
作为 Futurama 的分数,位于 Futurama.score
中,而不是位于 Futurama.stats.score
*为属性编写 setter ,它只是设置对象的两个值
*就像 this.updateScore = function (score) {//Forth Way
*
但我宁愿远离这个,因为我必须向对象添加方法
我不知道我是否根本不应该做这样的事情,或者我是否只是错过了这样做的方法真的很简单??
任何正确方向的建议或指出将不胜感激
提前感谢您的回答和耐心阅读本文
这是 JSBin摆弄
最佳答案
使用命名函数作为属性值来共享原子元素的实例:
foo = {"1":1}
bar = {"1": function baz() { return foo["1"] } }
foo["1"] = 2;
foo["1"] === bar["1"]();
引用文献
关于javascript - 部分继承 - 在对象之间共享原始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13970913/
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!